加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:47:05 所属栏目:百科 来源:网络整理
导读:编辑:谢谢你的答案!我使用std :: string返回类型声明了tellSomething方法,但它应该是无效的! 我绊倒自己并指责可怜的无罪删除运算符:)! 让我们考虑一个指向动态分配向量的指针,该向量包含指向动态分配对象的指针: // Create the vector of pointersstd:
编辑:谢谢你的答案!我使用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进行编译,通常一个警告可以为您节省大量的调试时间).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读