c – 为什么删除指向指针向量的指针会导致指针无效?

c – 为什么删除指向指针向量的指针会导致指针无效?,第1张

概述编辑:谢谢你的答案!我使用std :: string返回类型声明了tellSomething方法,但它应该是无效的! 我绊倒自己并指责可怜的无罪删除运算符:)! 让我们考虑一个指向动态分配向量指针,该向量包含指向动态分配对象的指针: // Create the vector of pointersstd::vector<A *>* v = new std::vector<A *>;// C 编辑:谢谢你的答案!我使用std :: string返回类型声明了tellSomething方法,但它应该是无效的!

我绊倒自己并指责可怜的无罪删除运算符:)!

让我们考虑一个指向动态分配向量的指针,该向量包含指向动态分配对象的指针:

// Create the vector of pointersstd::vector<A *>* v = new std::vector<A *>;// Create two objectsA *a1 = new A;A *a2 = new A;// Populate the vectorv->push_back(a1);v->push_back(a2);// Delete the vectordelete v;// Try accessing one of the objectsa1->tellSomething();    --> // Segmentation fault

正如预期的那样,如果我删除了向量,则不会调用包含对象上的删除(我也验证了在上面的代码中从不调用A :: ~A()),但是,最后一条指令给出了分段错误.

我对删除v的期望是两件事:

>调用每个包含对象的析构函数
>容器已解除分配

但在这种情况下,包含的对象是指针,因此不会调用析构函数.

此外,a1在列表末尾不是NulL.

那么,为什么分段错误呢?

完整示例:http://ideone.com/r8YC0.

注意:我通常不使用带有STL容器的原始指针,请将此代码视为一个纯粹的理论示例,以帮助我理解delete v指令的逻辑.

解决方法 你得到的崩溃是完全无关的;你声明tellSomething返回一个std :: string,但你永远不会返回任何东西,所以你进入未定义的行为 – land;在解除分配矢量后程序崩溃的事实纯粹是运气,即使在第一次调用tellSomething时也可能崩溃.

Fixing that problem使您的程序运行正常(尽管您正在泄漏a1和a2).

顺便说一句,这教会你打开所有的警告:用-Wall代码会给你一个关于这个潜在问题的明确警告:

matteo@teolapmint ~/cpp $g++ -Wall testwarns.cpp testwarns.cpp: In member function ‘std::string A::tellSomething()’:testwarns.cpp:12:5: warning: no return statement in function returning non-voID [-Wreturn-type]

(仅供记录:我个人建议使用-Wall -Wextra -ansi -pedantic进行编译,通常一个警告可以为您节省大量的调试时间).

总结

以上是内存溢出为你收集整理的c – 为什么删除指向指针向量的指针会导致指针无效?全部内容,希望文章能够帮你解决c – 为什么删除指向指针向量的指针会导致指针无效?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存