gpt4 book ai didi

c++ - 如何在 C++ 代码/项目中查找内存泄漏?

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

我是 Windows 平台上的 C++ 程序员。我正在使用 Visual Studio 2008。

我通常会在代码中出现内存泄漏。

通常我通过检查代码来发现内存泄漏,但它很麻烦并且并不总是一个好方法。

由于我买不起付费的内存泄漏检测工具,所以我希望你们提出避免内存泄漏的最佳方法。

  1. 我想知道程序员如何找到内存泄漏。
  2. 是否应该遵循任何标准或程序来确保程序中没有内存泄漏?

最佳答案

说明

你需要的东西

  • 精通C++
  • C++ 编译器
  • 调试器和其他调查软件工具

1

了解运算符(operator)基础知识。 C++ 运算符 new 分配堆内存。 delete 操作符释放堆内存。对于每个 new,您应该使用 delete 以便释放您分配的相同内存:

char* str = new char [30]; // Allocate 30 bytes to house a string.

delete [] str; // Clear those 30 bytes and make str point nowhere.

2

仅当您已删除内存时才重新分配内存。在下面的代码中,str 通过第二次分配获取一个新地址。第一个地址丢失了,无法挽回,它指向的 30 个字节也丢失了。现在它们无法释放,并且您有内存泄漏:

char* str = new char [30]; // Give str a memory address.

// delete [] str; // Remove the first comment marking in this line to correct.

str = new char [60]; /* Give str another memory address with
the first one gone forever.*/

delete [] str; // This deletes the 60 bytes, not just the first 30.

3

注意那些指针分配。每个动态变量(在堆上分配的内存)都需要与一个指针相关联。当动态变量与其指针解除关联时,就无法删除。同样,这会导致内存泄漏:

char* str1 = new char [30];

char* str2 = new char [40];

strcpy(str1, "Memory leak");

str2 = str1; // Bad! Now the 40 bytes are impossible to free.

delete [] str2; // This deletes the 30 bytes.

delete [] str1; // Possible access violation. What a disaster!

4

小心使用本地指针。您在函数中声明的指针是在堆栈上分配的,但它指向的动态变量是在堆上分配的。如果不删除,程序退出函数后会一直存在:

void Leak(int x){

char* p = new char [x];

// delete [] p; // Remove the first comment marking to correct.

}

5

注意“删除”后面的方括号。单独使用 delete 来释放单个对象。使用带有方括号的 delete [] 来释放堆数组。不要这样做:

char* one = new char;

delete [] one; // Wrong

char* many = new char [30];

delete many; // Wrong!

6

如果泄漏仍然允许 - 我通常使用 deleaker 寻找它(在此处查看:http://deleaker.com)。

关于c++ - 如何在 C++ 代码/项目中查找内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261201/

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