我有一个课程如下
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)的);
答案 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()返回更多的一个字节,以零终止字符串。