从函数C ++中删除内存

时间:2014-06-27 02:22:32

标签: c++ pointers reference new-operator delete-operator

我无法释放我正在使用的记忆而且有点困惑我将如何去做。当我使用下面的代码执行此操作时,我收到错误“检测到堆损坏... 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;
}

2 个答案:

答案 0 :(得分:3)

在更新的代码中,实际上会溢出缓冲区,导致堆损坏:

size_t size = strlen(org);
adjustVar(p, size);
memset(p, 0, size+1);    // overflow by 1 byte

此外,使用memsetstrncpy这样的风格很差;替换为:

size_t size = strlen(org);
adjustVar(p, size + 1);
strcpy(p, org);

strncpy的有效用途很少,因为在某些情况下它不会终止其缓冲区;根据您的需要,strcpymemcpy应首选。

答案 1 :(得分:1)

这里运行正常:http://ideone.com/Ap2DjG

作为答案,不要使用指针。如果您发现自己使用char *而是使用std::string。如果你必须使用指针,那么考虑将它们包装在boostc++11智能指针中。