gpt4 book ai didi

c++ - 为什么删除指向指针 vector 的指针会导致指针无效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:40 24 4
gpt4 key购买 nike

编辑:感谢您的回答!我用 std::string 返回类型声明了 tellSomething 方法,而它应该是 void!

我把自己绊倒了,责怪可怜的无辜的delete运算符(operator):)!


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

// 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

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

我对 delete v 的期望是两件事:

  • 调用每个包含对象的析构函数
  • 容器被释放

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

此外,a1 不是列表末尾的 NULL

那么,为什么会出现段错误?


完整示例在这里:http://ideone.com/r8YC0 .


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

最佳答案

您遇到的崩溃完全无关;你将 tellSomething 声明为返回一个 std::string,但你从未返回任何东西,所以你进入了未定义的行为领域;程序在解除分配 vector 后崩溃纯属运气,即使在第一次调用 tellSomething 时它也可能崩溃。

Fixing that problem使您的程序运行良好(尽管您正在泄漏 a1a2)。

顺便说一句,这会教您打开所有警告:使用 -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++ - 为什么删除指向指针 vector 的指针会导致指针无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11637756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com