我有 ;
class object {
// any private datas token in heap area
public :
~object () ;
};
Run Code Online (Sandbox Code Playgroud)
在功能;
vector < object*> tmp ;
Run Code Online (Sandbox Code Playgroud)
我的问题是;
Tyl*_*nry 17
你似乎有点困惑.这里有两个概念:
tmp,解除指针内引用的对象tmp?objectclass(~object)的析构函数应该做什么?这些并不是那么相关.完成tmp向量后,必须手动遍历并调用delete其每个元素,以释放object元素指向的对象占用的内存.当然,这是假设元素被分配new的.
object析构函数的目的~object是释放object对象拥有的所有内容,而不是释放object对象本身.如果object对象不拥有任何动态分配的数据,则不需要执行任何操作.
换句话说,当你写作时delete tmp[i],会发生两件事:
*(tmp[i])::~object() 叫做tmp[i]被释放注意,即使(1)绝对没有,也会发生(2).步骤(1)的要点是允许即将被解除分配的对象解除分配需要被解除分配的任何成员对象.析构函数的工作重点是不释放调用它的对象.
通过明确的例子:
class object {
private:
int foo;
public:
object() : foo(42) {}
~object() { /* nothing to do here; foo is not dynamically allocated */ }
};
int main() {
vector<object*> tmp;
tmp.push_back(new object());
// Do some stuff with tmp
for (int i = 0; i < tmp.size(); ++i) {
delete tmp[i]; // Calls ~object and deallocates *tmp[i]
}
tmp.clear();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者,相反
class object {
private:
int* foo;
public:
object() : foo(new int()) { *foo = 42; }
~object() {
// Now since foo is dynamically allocated, the destructor
// needs to deallocate it
delete foo;
}
};
int main() {
vector<object*> tmp;
tmp.push_back(new object());
// Do some stuff with tmp
for (int i = 0; i < tmp.size(); ++i) {
delete tmp[i]; // Calls ~object (which deallocates tmp[i]->foo)
// and deallocates *tmp[i]
}
tmp.clear();
return 0;
}
Run Code Online (Sandbox Code Playgroud)