我知道如果我在头文件中创建一个指针,我应该在调用析构函数时删除它,但是如果我在函数内部创建一个指针呢?我知道在块结束时基本变量会被破坏,指针是否相同?
例如:
Class::Function()
{
int i = 3; // This gets destroyed after the function ends
int* j = 5; // What about this? Do I have to delete it somewhere to keep from a leak?
}
如果我在构造函数中初始化j
,我会说delete j;
以防止泄漏等。在这种情况下我应该做些什么吗?
答案 0 :(得分:2)
将int
值分配给指针
int* j = 5;
是非法的,因为您要将int
存储到int*
。无论如何你可以施展它
int* j = reinterpret_cast<int*>( 5 );
但取消引用此指针会导致undefined behavior,因为您不知道该指针指向何处。
你应该初始化那样的指针
int* j = nullptr;
从c++11
开始,您无法创建nullptr_t
的实例并将其分配。
nullptr_t initPointer;
int* j = initPointer;
如果您不使用new
运算符为指针分配内存,则不能delete
此指针,它将导致undefined behavior。否则,如果您使用new
,则需要匹配delete
,否则您将获得memory leak。如果要检查程序是否有内存泄漏,请检查此thread并选择一个工具。我可以推荐valgrind。
答案 1 :(得分:0)
每次拨打new
都需要拨打delete
。如果new
比delete
更多,则会导致内存泄漏。如果相反,则得到double deletes。在您的情况下,如果您从未致电new
,则无需删除!
有一些工具可以帮助您匹配新的和删除。我个人最喜欢的是cppcheck。它超级快速且易于使用,并且它运行在c ++源代码上!它通常可以很好地捕获无与伦比的新呼叫和删除呼叫。