我对在C++程序中处理内存方面没有经验,因此我希望在这种情况下得到一些建议:
我想在类的一个函数中创建一个new Object
,这个对象在整个程序中都是必需的。据我所知,如果我使用new
运算符,有时候需要删除它。考虑到它必须在类中初始化,那么什么时候以及如何最终删除它呢?
我对在C++程序中处理内存方面没有经验,因此我希望在这种情况下得到一些建议:
我想在类的一个函数中创建一个new Object
,这个对象在整个程序中都是必需的。据我所知,如果我使用new
运算符,有时候需要删除它。考虑到它必须在类中初始化,那么什么时候以及如何最终删除它呢?
我建议使用智能指针技巧
#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
(其工作方式类似,但在赋值时传递所有权;这意味着指针不必保持引用计数) 注意:要了解更多关于C++智能指针的信息,请参见解释Boost智能指针 如果您没有对此进行TR1 / C ++ 0x支持,您可以使用Boost Smartpointer。 除非您正在泄漏 shared_ptr本身的副本; 这将是以前从未见过的智能指针的奇怪用法 :)您可以像Sehe建议的那样使用智能指针,也可以在函数中创建一个静态对象并返回对其的引用。在进程终止时,无需显式删除该对象,该对象将被删除。例如:
struct X {};
X& makeX() // could also be a class member of course
{
static X x;
return x;
}
int main()
{
X& stayaround = makeX();
}
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.
}
这是一个简单的例子,但它会帮助您更好地理解。请注意,只有在对象存在期间,变量才会持久存在。如果对象被销毁或超出作用域,则将调用析构函数并释放内存。
new
分配的内存。如果您要在堆上创建Foo
的实例,例如Foo f = new Foo;
,则在完成后必须调用delete f;
。调用delete f;
会从堆中删除实例,但在调用f
的析构函数之前,该函数将删除member
整数使用的内存。 - Chris Partondelete
一个指针时,应该将其设置为0,以便你不会意外引用已删除的内存。你不必太担心在析构函数中将指针设置为0,因为包含对象正在被销毁。 - Chris Parton在大多数操作系统(特别是Linux)上,如果你使用new Object
分配一个对象指针,并且不打算delete
它,因为你需要它直到程序结束,那么实际上并没有什么伤害。你的程序中会有一些内存泄漏(你可以使用valgrind来查找这样的泄漏),但是内核将在进程结束时释放该进程使用的所有内存。
更好的选择是为应用程序数据创建一个单例类,例如Qt中的QApplication,并在main
函数中早期构建一个单例实例,并让该类包含对Object
的智能或者普通指针。析构函数应该delete
该对象。
std::shared_ptr
?为什么不用std::unique_ptr
? - Nawazstd::unique_ptr
呢? - Nawazstd::shared_ptr
,很少看到std::unique_ptr
,但我认为std::unique_ptr
应该比std::shared_ptr
更普遍地使用。 - Nawaz