编辑:谢谢你的回答!我宣布tellSomething
方法的std::string
返回类型,而它应该是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()
从未在上面的代码中被调用),但是,最后的指令给出了分段错误。
我从delete v
期望是两件事情:
- ,每包含的对象调用析构函数
- 的容器被释放
但是,在这种情况下,所包含的对象是指针,所以没有调用析构函数。
此外,a1
不是NULL
在列表结束。
那么,为什么分段错误?
完整示例:http://ideone.com/r8YC0。
注:我不经常使用与STL容器裸指针,请考虑下面的代码作为一个纯粹的理论例子来帮助我理解delete v
指令的逻辑。
它是什么'a1-> tellSomething'在做什么? – Wug 2012-07-24 19:15:26
我相信'delete'关键字调用矢量的析构函数,它会依次删除所有指针 – 2012-07-24 19:15:32
这不应该发生。你怎么知道它不在tellSomething()方法中 - 你排除了这种可能性吗? – mathematician1975 2012-07-24 19:16:26