我在处理C ++程序中的内存方面没有经验,所以在这种情况下我想要一条建议:
我想在类中的函数中创建new Object
,这对于程序结束至关重要。就我而言,如果我使用运算符new
,我有时应该删除它。考虑到它必须在一个类中初始化,我何时以及如何最终删除它?
答案 0 :(得分:5)
我建议使用智能指针习惯用法
#include <memory>
struct X
{
void foo() { }
};
std::share_ptr<X> makeX() // could also be a class member of course
{
return std::make_shared<X>();
}
int main()
{
std::share_ptr<X> stayaround = makeX();
// can just be used like an ordinary pointer:
stayaround->foo();
// auto-deletes <sup>1</sup>
}
如果指针确实是一个静态变量,你可以替换unique_ptr
(它的工作方式类似,但在赋值时传递所有权;这意味着指针不必保持引用计数< / em>的)
注意 要了解有关C ++智能指针的更多信息,请参阅 smart pointers (boost) explained
注意 如果你没有TR1 / C ++ 0x支持,你可以使用Boost Smartpointer
<子> 1 除非您泄漏 shared_ptr本身的副本;这将是以前看不见的智能指针的奇怪用法:)
答案 1 :(得分:2)
您可以使用Sehe建议的智能指针,或者您可以在函数中创建静态对象并返回对它的引用。您无需明确删除该对象,当进程终止时该对象将被删除。像:
struct X {};
X& makeX() // could also be a class member of course
{
static X x;
return x;
}
int main()
{
X& stayaround = makeX();
}
答案 2 :(得分:1)
编辑:使用某种智能指针通常是一个好主意,但我相信在C ++中对手动内存管理有充分的了解仍然是必不可少的。
如果希望类中的对象持续到程序结束,则可以简单地将其作为成员变量。根据您的说法,没有任何迹象表明您需要在此使用new
或delete
,只需将其设为自动变量即可。如果您确实希望使用new
和delete
进行练习,则应该阅读构造函数和析构函数以获取类(您可以并且将会在课堂外使用new
和delete
,但我试图将此问题与您的问题保持一致。这是我之前准备的一个:
class Foo
{
public:
Foo(); // Default constructor.
~Foo(); // Destructor.
private:
int *member;
}
Foo::Foo() // Default constructor definition.
{
member = new int; // Creating a new int on the heap.
}
Foo::~Foo() // Destructor.
{
delete member; // Free up the memory that was allocated in the constructor.
}
这是一个简单的例子,但它有望帮助你。请注意,只要对象处于活动状态,变量将仅保留。如果对象被销毁或超出范围,则将调用析构函数并释放内存。
答案 3 :(得分:0)
在大多数操作系统(特别是Linux)上,如果您使用new Object
分配对象指针,并且不打扰delete
- 因为您需要它直到程序结束,否伤害确实完成了。程序内部存在一些内存泄漏(您可以使用valgrind来查找此类泄漏)但内核将释放进程结束时使用的所有内存。
更好的选择是为应用程序数据提供单例类,例如在Qt QApplication中,ahd在main
的早期在该类中构造了一个实例,并让该类包含指向Object
的智能或哑指针。析构函数应该delete
该对象。