这会导致内存泄漏吗? 我的C++很生锈,所以现在我开始用它做一个爱好项目,我必须“升级”——再次…

这会导致内存泄漏吗? 我的C++很生锈,所以现在我开始用它做一个爱好项目,我必须“升级”——再次…,c++,memory-leaks,C++,Memory Leaks,这会导致内存泄漏吗?如果程序决定不再需要指针,我如何删除它们 “delete t”是否足够或是否也会产生内存泄漏?中的指针已分配但从未删除。您需要为b定义一个析构函数来删除a,否则每次b超出范围时,您都会泄漏指针指向的a: b::~b() { delete pointer; } b中的指针已分配,但从未删除。您需要为b定义一个析构函数来删除a,否则每次b超出范围时,您都会泄漏指针指向的a: b::~b() { delete pointer; } 对于每个新的,必须有一个匹配的

这会导致内存泄漏吗?如果程序决定不再需要指针,我如何删除它们


“delete t”是否足够或是否也会产生内存泄漏?

中的指针已分配但从未删除。您需要为
b
定义一个析构函数来删除
a
,否则每次
b
超出范围时,您都会泄漏
指针指向的
a

b::~b()
{
    delete pointer;
}

b
中的
指针已分配,但从未删除。您需要为
b
定义一个析构函数来删除
a
,否则每次
b
超出范围时,您都会泄漏
指针指向的
a

b::~b()
{
    delete pointer;
}
对于每个新的,必须有一个匹配的删除

对于每个新的,都必须有一个匹配的删除。

是的,它会

您应该将此函数添加到
b
类中:

~b() { delete this->pointer; }
是的,会的

您应该将此函数添加到
b
类中:

~b() { delete this->pointer; }

b
包含一个指针,您可以分配该指针,但不能释放该指针。是的,这将导致内存泄漏

处理这个问题的老式方法是删除
b
的析构函数中的指针,因为您知道它永远不会被再次使用


较新的方法是使用“智能指针”,如boost::shared_ptr(或std::auto_ptr,如果必须),而不是指向对象的普通指针。

Class
b
包含一个您分配但从不释放的指针。是的,这将导致内存泄漏

处理这个问题的老式方法是删除
b
的析构函数中的指针,因为您知道它永远不会被再次使用


较新的方法是使用“智能指针”,如boost::shared_ptr(或std::auto_ptr,如果必须),而不是指向对象的普通指针。

其他答案都是正确的,您需要添加一个析构函数来删除
指针成员。我要补充的是,您可能还需要一个拷贝构造函数和拷贝赋值操作符来正确处理该指针


另外,我建议您研究智能指针,例如(在C++0x中将成为std::shared_ptr)。

其他答案都是正确的,您需要添加一个析构函数来删除
指针
成员。我要补充的是,您可能还需要一个拷贝构造函数和拷贝赋值操作符来正确处理该指针

另外,我建议您研究智能指针,例如(在C++0x中将成为std::shared_ptr)。

1)是的,它将导致内存泄漏,因为
a
是动态分配的,但从未释放。
2) 否-
delete t
不够,因为
t
负责管理/释放自己的资源。
要解决此问题,您需要为
b
i、 e

但是,为了超级安全,您还可以将析构函数设置为虚拟的
i、 e

这将确保在任何派生类中调用正确的析构函数
HTH

1)是的,它将导致内存泄漏,因为
a
是动态分配的,但从未释放。
2) 否-
delete t
不够,因为
t
负责管理/释放自己的资源。
要解决此问题,您需要为
b
i、 e

但是,为了超级安全,您还可以将析构函数设置为虚拟的
i、 e

这将确保在任何派生类中调用正确的析构函数

HTH

您不能删除t,它不是指针。您可以在b中有一个名为“release”的方法,如果您愿意,它可以提前删除指针。在本例中,a看起来有点像b的“pImpl”,即,它用于实现b中相同的调用


正如其他回答者正确指出的那样,如果b使用new创建指向a的指针,其析构函数必须删除它,但您需要的不仅仅是这个。您需要确保不复制也会试图删除指针的b。因此,使b不可复制且不可分配。如果它们需要可复制或可分配,您必须重载它们来管理指针。

您不能删除t,它不是指针。您可以在b中有一个名为“release”的方法,如果您愿意,它可以提前删除指针。在本例中,a看起来有点像b的“pImpl”,即,它用于实现b中相同的调用


正如其他回答者正确指出的那样,如果b使用new创建指向a的指针,其析构函数必须删除它,但您需要的不仅仅是这个。您需要确保不复制也会试图删除指针的b。因此,使b不可复制且不可分配。如果它们需要可复制或可分配,您必须重载它们来管理指针。

从技术上讲,没有内存泄漏,因为程序在暂停完成后退出。当程序退出时,它分配的所有内存都将被释放


当然,其他答案是正确的。“b”应该有一个析构函数,用于删除“新”分配的内存。

技术上没有内存泄漏,因为程序在暂停完成后退出。当程序退出时,它分配的所有内存都将被释放


当然,其他答案是正确的。“b”应该有一个析构函数,用于删除“new”分配的内存。

正如前面提到的类“b”应该有一个析构函数,用于删除构造函数中分配的内存。然而,正如马丁·约克在上文中所评论的那样,这并不是一个全面的答案。正如他所指出的,这里有一些关于复制构造函数和赋值运算符的问题需要注意,但我会更进一步:停止使用原始指针,立即开始使用智能指针

<
~b()
{
   delete pointer;
}
virtual ~b()
{
   delete pointer;
}
class b
{
public:
    b() { this->pointer.reset(new a); }
    void call() { this->pointer->call(); }
private:
    boost::shared_ptr<a> pointer;
};