堆内存损坏 [英] Heap corruption while freeing memory

查看:214
本文介绍了堆内存损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类如下

  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){
//设置命令行参数
argc_ = argc;

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

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

// destructor

  CliHandler ::〜CliHandler(){
for(int i = 0; i free(argv_ [i] ;
free(argv_); }当我调试时,我得到一个错误堆检测到腐败CRT检测到应用程序写入内存在堆缓冲区结束后。我的问题id我在哪里犯错误?我如何解决它。我使用的是视觉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));



解决方案

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

这是因为您的StrCpy可能会破坏您的记忆。你必须考虑终止nul字节,只要你的StrCpy的工作原理类似于标准的strcpy(它必须为了有用,更好地使用标准的strcpy(),除非你有一个很好的理由不)。



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


I have a class as follows

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

     int doWork();

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

//Constructor

 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]);
     } }

// destructor

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

While I debug, I get an error " Heap corruption detected. CRT detected that application wrote to memory after end of heap buffer. " My question id "Where exactly am i making a mistake ? How do I fix it". I am using visual stdio 2008.

Edit:I did something like this to add 1

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

Which is terrible as it increments the pointer argv[i] by one. My co-worker pointed out that subtle issue. It should be

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

解决方案

Change the code to:

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

It's because your StrCpy likely trashes your memory. You have to account for the terminating nul byte as well, provided your StrCpy works like the standard strcpy (which it has to in order to be useful, better just use the standard strcpy() unless you have a good reason not to).

sizeof(char) is by definition 1, so that can be omitted too.

这篇关于堆内存损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆