内存泄漏的基本概念是代码执行期间新/删除操作的不匹配,可能是由于错误的编码实践,也可能是在跳过删除操作时出现错误的情况.
但最近我在一次采访中被问到一个问题,关于内存泄漏的其他方式.我没有答案.它是什么?
Alo*_*ave 16
常见的动态内存问题是:
new而不是取消分配的动态内存分配delete. new[]和取消分配动态内存分配delete. new并将其解除分配free. malloc并将其解除分配delete. 除了内存泄漏/内存损坏之外,最后3个场景将导致可怕的未定义行为.
我可以回忆一些其他潜在的内存泄漏导致的情况是:
一个代码示例:
char *a = new[128];
char *b = new[128];
b = a;
delete[]a;
delete[]b; // will not deallocate the pointer to the original allocated memory.
Run Code Online (Sandbox Code Playgroud)
- STL容器中的指针
更常见且经常遇到的情况是,存储指向STL容器中动态分配类型的指针.重要的是要注意,只有当 STL容器不是指针类型时,它才拥有删除包含对象的所有权.
在删除容器本身之前,必须显式迭代容器并删除每个包含的类型.不这样做会导致内存泄漏.
以下是此类方案的示例.
- 非虚拟基类析构函数问题
删除指向Base类的指针,该指针指向堆上派生类的任何动态分配对象.这会导致未定义的行为.
一个代码示例:
class MyClass
{
public:
virtual void doSomething(){}
};
class MyClass2 : public MyClass
{
private:
std::string str;
public: MyClass2( std::string& s)
{
str=s;
}
virtual void doSomething(){}
};
int main()
{
std::str hello("hello");
MyClass * p = new MyClass2(hello);
if( p )
{
delete p;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在示例中,仅调用析构函数MyClass ::〜MyClass(),并且永远不会调用MyClass2 :: ~MyClass2().为了适当的释放,人们需要,
MyClass::virtual ~MyClass(){}
Run Code Online (Sandbox Code Playgroud)
-调用delete上的void指针
一个代码示例:
void doSomething( void * p )
{
//do something interesting
if(p)
delete p;
}
int main()
{
A* p = new A();
doSomething(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
呼叫delete上的void指针如在上面的例子中,会引起了内存泄漏和未定义的行为.
| 归档时间: |
|
| 查看次数: |
3122 次 |
| 最近记录: |