区分堆栈上分配的对象与堆对象

时间:2014-07-02 11:20:35

标签: c++ c++11

说我有以下结构

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对象不可复制的那一刻)?

2 个答案:

答案 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 ++中,您必须决定并知道谁负责分配和取消分配对象。如果您确实需要灵活性,可以添加参数(或不同的重载)以允许用户指示他们是否希望在析构函数中销毁对象。