可以使用动态分配的内存初始化引用成员吗?

时间:2010-08-19 16:48:15

标签: c++

我是在这里造成内存泄漏还是可以这样做?我应该使用智能指针成员而不是引用?

class A
{
public:

   A() : b_(*(new B))
   {}

private:
   B& b_;
};

int main()
{
    A a;
    return 0;
}

4 个答案:

答案 0 :(得分:5)

你肯定在泄露记忆;每个new都需要与delete匹配。

除非有充分的理由动态分配它,否则只需将b_作为对象就可以了。否则,按照您的建议使用智能指针,或者在析构函数中使用(不推荐)delete,记住要使复制构造函数和复制赋值行为正确。在最后一种情况下,它是一个有效的(但有点不寻常),它是一个参考而不是一个指针。

这个决定实际上取决于您在复制时希望班级的行为方式。在第一种情况下,它将复制整个对象;在第二个中,它将按照智能指针的定义运行;在第三种情况下,它将按照您实现的复制构造函数/赋值的定义运行。

答案 1 :(得分:1)

语言允许这样做,但是,正如你所写的那样,存在内存泄漏。你有一个new但没有相应的delete - 你需要在这里写一个析构函数,例如:

A::~A() {
    delete &b_;
}

现在,虽然这是合法的,但这很奇怪。指针也可以做到,并且可能会更好地传达正在发生的事情。智能指针可以帮助您避免泄漏,并且可能适用。

答案 2 :(得分:1)

是的,它在C ++中是允许的。

当然,使用智能指针更安全。

然后你不必担心在析构函数中清除已分配的内存。

像这样:

#include <memory>

class A {
public:
   A() : p_b( new B() )
   {}
   someMethod() {
       return p_b->something();
   }
private:
   std::auto_ptr<B> p_b;
};
int main()
{
    A a;
    return 0;
}

答案 3 :(得分:0)

我唯一想说的是,即使你在构造函数中分配内存,这意味着b总是以一个值开头,在析构函数中我会稍微改变一下Justin中写道。我在调用NULL之前总是检查delete,然后在释放之后将指针设置为NULL。在析构函数设置中,指向NULL的指针是没有意义的,但只是为了保持一致。

class A
{
public:

   A():b_(new B)
   ~A() { if (b) { delete b; b = NULL; } }
   {}

private:
   B* b_;

}