【发布时间】:2020-12-19 09:07:52
【问题描述】:
在 C++ 中,我们可以通过取消引用将类的堆分配对象分配给堆栈分配对象。看起来没有问题,即使析构函数也能正常工作,但这样写代码是好是坏?
#include <iostream>
class cls {
public:
cls(int n) : pInt{new int{n}} {
std::cout << "Constructor\n";
}
int *pInt;
~cls() {
std::cout << "Destructor\n";
delete pInt;
}
};
int main() {
cls *hObj = new cls{100};
cls sObj = *hObj;
}
【问题讨论】:
-
这个程序好用吗?令人惊讶(因为 Some 程序员老兄指出的原因)。 你确定你周围没有堆栈转储吗?你检查退出状态了吗?在第二个“析构函数”输出之后有什么有趣的控制台消息吗?
-
顺便说一句,如果您只是使用向量而不是手动分配(这通常是要做的事情),您可以避免动态内存管理问题。
-
@Peter-ReinstateMonica 没有“第二个”输出,因为只有一个对象被破坏:
sObj。 OP 永远不会删除hObj,因此它的析构函数永远不会运行。 -
@Someprogrammerdude 对,我只是在阅读您帖子下的其他 cmets。当然只有 1 个。事实上,可以像
cls hObj = *(new cls{100})一样使用浅拷贝作为 RAII 哨兵,默默地将原始对象送入遗忘!并不是说我会宽恕这种风格......
标签: c++ constructor destructor heap-memory stack-memory