说我有以下结构
struct X
{
X () = delete;
X(const std::string &);
//all other copy/move/assignment ctors PLUS dtor are defined, just the default is deleted
/* members */
};
struct Y
{
X & x_object;
Y( const std::string & str): Y { *(new X { str }) } { }
Y( X &obj): x_object(obj) { }
~Y() {
// x_object is needed to be freed here, would
}
};
如何知道堆或堆栈上是否分配了 x_object ?如果我将 x_object 声明为std::shared_ptr<X>
,则表示我需要在Y ctor中复制 obj 需要一个X对象。在堆栈上分配的对象上调用 delete AFAIK是一种未定义的行为(第5.3.5节。我已经完成了delete &x_object
)。 OR是否还有其他方法可以执行此操作,它必须直接反映在传递的任何X对象中(假装X对象不可复制的那一刻)?
答案 0 :(得分:3)
解决释放问题的方法:
struct Y
{
public:
Y(const std::string & str) :
x_owned(new X { str }), // Have ownership of X
x_object(*x_owned)
{}
Y(X &obj) : x_owned(), x_object(obj) {}
~Y() = default;
private:
std::unique_ptr<X> x_owned;
X& x_object;
};
答案 1 :(得分:0)
您无法决定对象是否具有自动生命周期(“堆栈”)或动态生命周期(“堆”),至少不能以便携方式。即使你可以做到这一点,这也是非惯用的。
在C ++中,您必须决定并知道谁负责分配和取消分配对象。如果您确实需要灵活性,可以添加参数(或不同的重载)以允许用户指示他们是否希望在析构函数中销毁对象。