我绊倒自己并指责可怜的无罪删除运算符:)!
让我们考虑一个指向动态分配向量的指针,该向量包含指向动态分配对象的指针:
// 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 – 为什么删除指向指针向量的指针会导致指针无效?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)