我知道如果我在头文件中创建一个指针,我应该在调用析构函数时始终删除它,但是如果我在函数内创建一个指针呢?我知道基本变量在块的末尾被破坏,指针也一样吗?
例如:
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;
以防止泄漏等。在这种情况下,我应该做些什么吗?
将int
值分配给指针
int* j = 5;
是非法的,因为您正在存储int
int*
。反正你可以投射它
int* j = reinterpret_cast<int*>( 5 );
但是取消引用此指针会导致未定义的行为,因为您不知道该指针指向何处。
你应该初始化这样的指针
int* j = nullptr;
由于c++11
您无法创建nullptr_t
实例并分配它。
nullptr_t initPointer;
int* j = initPointer;
如果不使用运算符new
将内存分配给指针,则无法delete
此指针,这将导致未定义的行为。否则,如果您使用new
则需要匹配delete
否则会出现内存泄漏。如果要检查程序是否有内存泄漏,请检查此线程并选择一个工具。我可以推荐瓦尔格林德。
每次调用new
都需要一个匹配的调用来delete
。如果你的new
多于delete
,你就会得到内存泄漏。如果相反,您将获得双重删除。在您的情况下,如果您从未调用过new
,则无需删除!
有一些工具可以帮助您匹配新删除。我个人最喜欢的是cppcheck。它非常快速且易于使用,并且可以在 c++ 源代码上运行!它通常在捕获不匹配的新呼叫和删除呼叫方面做得很好。