内存泄漏(字符[])
Memory Leak (char[])
当我运行我的程序时,它可以运行一段时间,然后突然之间,它经历了巨大的内存泄漏。当它崩溃时,我使用堆的快照对其进行了跟踪,我有一个大小为 232,023,801 字节的神秘字符[]。在此之前,崩溃前几分钟没有异常行为。我使用 char 数组的唯一地方是在以下代码段中:
string ReadString(DWORD64 addr) {
char* buffer = new char[128];
bool validChar = true;
for (int c = 0; c < 128 && validChar; c++) {
buffer[c] = Mem.Read<char>(addr+ (0x1 * c), sizeof(char));
if (!isalnum(buffer[c]) && !ispunct(buffer[c]))
validChar = false;
}
string ret= string(buffer);
delete[] buffer;
return ret;
}
所有这些代码应该做的是从内存中读取几个字符,将 char 数组保存到字符串中,清理数组,然后返回字符串。内存泄漏是如何从这里产生的?或者堆快照中的 char[] 是否可能指向另一个问题?
假设这里的string
是std::string
:
调用string(buffer)
假定buffer
以 0 结尾并分配一个新字符串。但是你的代码不能确保buffer
实际上是 0 终止的,因此这可能会导致未定义的行为,包括可能崩溃或为字符串分配太多内存。
您可能希望改用string(buffer, size)
构造函数,它不需要以 0 结尾buffer
。
我还建议避免手动new
/delete
。一种方法是创建一个空字符串并push_back
您读取的字符。这避免了对buffer
的需求。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 内存泄漏(字符[])
- 用valgrind分析c++字符内存泄漏
- 由 strcpy 设置的解除分配字符 * 时内存泄漏?
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为
- Valgrind在定义字符*数组时报告内存泄漏
- 如何避免内存泄漏与返回常量字符*
- C++内存泄漏字符 *
- 字符字符串长度和内存泄漏
- 为什么c++子类中的字符串会导致内存泄漏