【发布时间】:2021-11-05 10:20:55
【问题描述】:
首先,除非我误解了它,否则析构函数会释放对象内部变量占用的内存。在下面的示例中,它将删除 * str 指向的字符串。就是这样。
class StrPtr {
private:
string * str;
public:
StrPtr() : str(new string()) {}
~StrPtr() { delete str; }
void add(char c) { str->push_back(c); }
};
但是,这是我的困惑。如果析构函数不破坏对象本身。这是否意味着:
-
在 for 循环之后,我有 10k 个 StrPtr 对象。
-
for 循环一结束,10k StrPtr 对象就会被删除,因为它们超出了范围。
-
每次 someF() 函数完成执行时,对象都会被删除,因为它超出了范围。因为这是创建它的地方。这是我目前的想法。
void someF() {
StrPtr s;
s.add('a');
}
int main() {
for (int i = 0; i < 10000; i++) {
someF();
}
}
【问题讨论】:
-
不删除就会泄露。
-
你的循环将进入
someF10000 次,每次它创建一个StrPtr,添加'a',然后在函数返回主循环时销毁StrPtr。在此代码中,您一次最多有 1 个StrPtr。编辑:这是你的情况#3。 -
这里没有泄漏。但是
StrPtr不遵守 5/3/0 规则(复制/移动构造函数/赋值)。 -
在类的构造函数中使用简单的
std::cout << "ctor\n";,在类的析构函数中使用std::cout << "dtor\n";,可以消除大部分/所有困惑。
标签: c++ memory-leaks scope destructor