我有一堂课如下
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] = (字符*)
malloc(strlen(argv[i] + 1) *
大小(字符));
这很糟糕,因为它将指针 argv[i] 加一。我的同事指出了这个微妙的问题。它应该是
argv_[i] = (字符*)
malloc( (strlen(argv[i]) + 1) *
大小(字符));
将代码更改为:
argv_[i] = (char*) malloc(strlen(argv[i]) + 1) ;
strcpy(argv_[i], argv[i]);
这是因为你的 StrCpy 可能会破坏你的记忆。您还必须考虑终止 nul 字节,前提是您的 StrCpy 与标准 strcpy 一样工作(它必须如此才能有用,最好只使用标准 strcpy() ,除非您有充分的理由不这样做)。
sizeof(char) 根据定义为 1,因此也可以省略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)