在释放内存的同时堆积腐败

时间:2011-05-09 19:38:09

标签: c++ malloc free heap-corruption

我有一个课程如下

 struct CliHandler {
     CliHandler(int argc, char** argv);
     ~CliHandler();

     int doWork();

     int argc_; 
     char** argv_;  
     private:
     CliHandler(const CliHandler&){}
     CliHandler& operator=(const CliHandler&){} 
 };

//构造

 CliHandler::CliHandler(int argc,
 char** argv) {
     //set command line parameters
     argc_ = argc; 

     argv_ = (char**) malloc(argc_ * sizeof(char*));

     for(int i=0; i<argc_; ++i)
     {
         std::cout<<sizeof(argv[i]); 
         argv_[i] = (char*) malloc(strlen(argv[i]) *
 sizeof(char));
         StrCpy(argv_[i], argv[i]);
     } }

//析构函数

 CliHandler::~CliHandler() {
     for(int i=0; i<argc_; ++i)
         free(argv_[i]); 
     free(argv_);  }

当我调试时,我收到一个错误“检测到堆损坏.CRT检测到应用程序在堆缓冲区结束后写入内存。”我的问题ID“我到底在哪里犯了错误?如何解决它”。我正在使用visual stdio 2008.

编辑:我做了类似的事情来添加1

  

argv_ [i] =(char *)   malloc(strlen(argv [i] + 1)*   的sizeof(char)的);

这很糟糕,因为它将指针argv [i]递增1。我的同事指出了微妙的问题。它应该是

  

argv_ [i] =(char *)   malloc((strlen(argv [i])+ 1)*   的sizeof(char)的);

4 个答案:

答案 0 :(得分:8)

将代码更改为:

 argv_[i] = (char*) malloc(strlen(argv[i]) + 1) ; 
 strcpy(argv_[i], argv[i]); 

这是因为你的StrCpy可能会破坏你的记忆。你必须考虑终止的nul字节,只要你的StrCpy像标准strcpy一样工作(为了有用它必须使用标准strcpy(),除非你有充分的理由不这样做)。

sizeof(char)根据定义1,因此也可以省略。

答案 1 :(得分:1)

如果要复制它,则需要分配比C字符串的strlen多一个字符。这是因为strlen不计算终止空字符。

答案 2 :(得分:1)

请使用strdup() - 它会为您分配适量的内存并复制字符。

答案 3 :(得分:0)

如果StrCpy类似于strcpy,它将写入比strlen()返回更多的一个字节,以零终止字符串。