【发布时间】:2012-07-23 04:16:03
【问题描述】:
编辑:感谢您的回答!我用std::string 返回类型声明了tellSomething 方法,而它应该是void!
我把自己绊倒并责怪可怜的无罪delete运营商:)!
让我们考虑一个指向动态分配的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()),但是,最后一条指令给出了分段故障。
我对@987654331@ 的期望有两点:
- 调用每个包含对象的析构函数
- 容器被释放
但在这种情况下,包含的对象是指针,所以没有调用析构函数。
另外,a1 不是列表末尾的NULL。
那么,为什么会出现分段错误?
此处的完整示例:http://ideone.com/r8YC0。
注意:我通常不将原始指针与 STL 容器一起使用,请将此代码视为纯理论示例,以帮助我理解 delete v 指令的逻辑。
【问题讨论】:
-
这是
a1->tellSomething在做什么吗? -
我相信
delete关键字调用了向量的析构函数,这反过来又删除了你所有的指针 -
这不应该发生。你怎么知道它不在 tellSomething() 方法中 - 你排除了这种可能性吗?
-
@SamIam,当 AFAIR 被破坏时,向量不会释放指针。您必须手动释放它们,这就是智能指针在那里工作良好的原因。
标签: c++ destructor delete-operator