我是在这里造成内存泄漏还是可以这样做?我应该使用智能指针成员而不是引用?
class A
{
public:
A() : b_(*(new B))
{}
private:
B& b_;
};
int main()
{
A a;
return 0;
}
答案 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_;
}