Ete*_*ner 5 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&){}
};
Run Code Online (Sandbox Code Playgroud)
//构造函数
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]);
} }
Run Code Online (Sandbox Code Playgroud)
//析构函数
CliHandler::~CliHandler() {
for(int i=0; i<argc_; ++i)
free(argv_[i]);
free(argv_); }
Run Code Online (Sandbox Code Playgroud)
当我调试时,我收到一个错误"检测到堆损坏.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));
将代码更改为:
argv_[i] = (char*) malloc(strlen(argv[i]) + 1) ;
strcpy(argv_[i], argv[i]);
Run Code Online (Sandbox Code Playgroud)
这是因为你的StrCpy可能会破坏你的记忆.你必须考虑终止的nul字节,只要你的StrCpy像标准strcpy一样工作(为了有用它必须使用标准strcpy(),除非你有充分的理由不这样做).
sizeof(char)根据定义1,因此也可以省略.
| 归档时间: |
|
| 查看次数: |
10333 次 |
| 最近记录: |