【发布时间】:2019-04-04 12:42:31
【问题描述】:
这是我的程序:
#include <iostream>
using namespace std;
class Object {
public:
Object() { cout << "Object constructor!" << endl; }
~Object() { cout << "Object destructor!" << endl; }
Object(const Object& obj) { information = obj.information; cout << "Copy constructor!" << endl; }
void setInformation(const string info) { information = info; }
string getInformation() const { return information; }
private:
string information;
};
class Storage {
public:
Storage() { object = static_cast<Object*>(operator new(sizeof(Object))); }
~Storage() { operator delete(object); }
void setObject(const Object& obj) {
// Todo: assign obj to the allocated space of the pointer object
}
private:
Object* object;
};
int main()
{
Object o;
o.setInformation("Engine");
Storage storage;
storage.setObject(o);
return 0;
}
在存储中,我分配空间来存储一个 Object 类型的对象而不创建它。我正在使用placement new来分配内存,并在析构函数中释放它。我知道我可以使用
object = new(object) Object()
构造一个对象。但是我可以在内存中放入一个已经创建的对象吗?就我而言,调用方法 setObject()。如果是的话,我会遇到这样的内存管理什么问题?提前致谢。
【问题讨论】:
-
这里的问题很多。除了
Storage本身违反了三规则之外,如果setObject从未被调用,则析构函数会尝试delete一些不是作为对象实例构造的东西。卡布姆。 -
您需要在某处分配您的对象,并且没有理由将来自
setObject的对象分配在堆栈上,并且您无法检索它,因为它是常量。所以你不能把它分配给你的指针。使用 unique_ptr 存储对象并在调用 setObject 时创建一个新对象。如果您不想创建新的 obe,请传入 unique_ptr。明确说明您的内存管理。 -
Sam,我知道,但感谢您指出这一点。该程序尚未完成。这就是为什么我决定先问具体问题:如何填充方法 setObject()。我知道我以后必须显式调用析构函数。
-
你仅限于 c++11 吗?
-
不,我不受限制。据我了解,这不能在 C++ 11 中完成,对吧?
标签: c++ c++11 reference placement-new