gpt4 book ai didi

c++ - 泄漏内存的不同方式

转载 作者:IT老高 更新时间:2023-10-28 22:25:30 25 4
gpt4 key购买 nike

内存泄漏的基本概念是代码执行期间新/删除操作的不匹配,这可能是由于错误的编码习惯或在跳过删除操作时出现错误。

但最近我在一次采访中被问到一个关于内存泄漏的其他方式的问题。我没有答案。这是什么?

最佳答案

常见的动态内存问题有:

  • 使用 new 动态分配内存,而不使用 delete 解除分配。
  • 使用 new[] 动态分配内存并使用 delete 解除分配。
  • 动态内存分配new并用free释放它。
  • 动态内存分配malloc并用delete解除分配。

除了内存泄漏/内存损坏之外,最后 3 种情况会导致可怕的 Undefined Behavior

我记得的其他一些可能导致内存泄漏的情况是:

  • 如果指向动态分配的内存区域的指针在被释放之前被重新分配一个新值,它将导致 dangling pointer 和内存泄漏。

代码示例:

char *a = new[128];
char *b = new[128];
b = a;
delete[]a;
delete[]b; // will not deallocate the pointer to the original allocated memory.

- STL 容器中的指针

一个更常见且经常遇到的场景是,将指向动态分配类型的指针存储在 STL 容器中。需要注意的是,STL 容器只有在它不是指针类型时才拥有删除所包含对象的所有权
在删除容器本身之前,必须显式地遍历容器并删除每个包含的类型。不这样做会导致内存泄漏。
Here 就是这种情况的一个例子。

- 非虚拟基类析构函数问题

删除指向基类的指针,该指针指向堆上派生类的任何动态分配对象。这会导致未定义的行为。

代码示例:

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;
}

在示例中,只有析构函数 MyClass::~MyClass() 被调用,而 MyClass2::~MyClass2() 永远不会被调用。对于适当的重新分配,需要,

MyClass::virtual ~MyClass(){}

- 在 void 指针上调用 delete

代码示例:

void doSomething( void * p ) 
{
//do something interesting
if(p)
delete p;
}

int main()
{
A* p = new A();
doSomething(p);
return 0;
}

如上例在 void 指针上调用 delete 会导致内存泄漏和未定义行为。

关于c++ - 泄漏内存的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com