c – 为什么删除指向指针向量的指针会导致指针无效?
编辑:谢谢你的答案!我使用std :: string返回类型声明了tellSomething方法,但它应该是无效的!
我绊倒自己并指责可怜的无罪删除运算符:)! 让我们考虑一个指向动态分配向量的指针,该向量包含指向动态分配对象的指针: // Create the vector of pointers std::vector<A *>* v = new std::vector<A *>; // Create two objects A *a1 = new A; A *a2 = new A; // Populate the vector v->push_back(a1); v->push_back(a2); // Delete the vector delete v; // Try accessing one of the objects a1->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进行编译,通常一个警告可以为您节省大量的调试时间). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |