我无法释放我正在使用的记忆而且有点困惑我将如何去做。当我使用下面的代码执行此操作时,我收到错误“检测到堆损坏... CRT检测到应用程序在堆缓冲区结束后写入内存”。我还调试了以确保使用Crtdb存在内存泄漏,并且该变量存在泄漏。我很困惑如何释放它。
#include <iostream>
#include <string.h>
using namespace std;
void adjustVar(char*& pointer, size_t i) {
pointer = new char[i];
}
int main(void) {
const char* org = "HELLOWORLD";
char* p = nullptr;
size_t size = strlen(org);
adjustVar(p, size);
memset(p, 0, size+1);
strncpy(p, org, size);
cout << p << endl;
delete[] p;
return 0;
}
答案 0 :(得分:3)
在更新的代码中,实际上会溢出缓冲区,导致堆损坏:
size_t size = strlen(org);
adjustVar(p, size);
memset(p, 0, size+1); // overflow by 1 byte
此外,使用memset
和strncpy
这样的风格很差;替换为:
size_t size = strlen(org);
adjustVar(p, size + 1);
strcpy(p, org);
strncpy
的有效用途很少,因为在某些情况下它不会终止其缓冲区;根据您的需要,strcpy
或memcpy
应首选。
答案 1 :(得分:1)
这里运行正常:http://ideone.com/Ap2DjG
作为答案,不要使用指针。如果您发现自己使用char *而是使用std::string
。如果你必须使用指针,那么考虑将它们包装在boost
或c++11
智能指针中。