编辑:谢谢你的回答!我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
指令的逻辑。