使用strcpy()与动态内存

3

我的代码运行正常,没有内存泄漏。但是,我收到了valgrind错误:

==6304== 14 errors in context 4 of 4:
==6304== Invalid write of size 1
==6304==    at 0x4A0808F: __GI_strcpy (mc_replace_strmem.c:443)
==6304==    by 0x401453: main (calc.cpp:200)
==6304==  Address 0x4c390f1 is 0 bytes after a block of size 1 alloc'd
==6304==    at 0x4A075BC: operator new(unsigned long) (vg_replace_malloc.c:298)
==6304==    by 0x401431: main (calc.cpp:199)

==6304== 4 errors in context 2 of 4:
==6304== Invalid read of size 1
==6304==    at 0x39ADE3B0C0: ____strtod_l_internal (in /lib64/libc-2.12.so)
==6304==    by 0x401471: main (calc.cpp:203)
==6304==  Address 0x4c390f1 is 0 bytes after a block of size 1 alloc'd
==6304==    at 0x4A075BC: operator new(unsigned long) (vg_replace_malloc.c:298)
==6304==    by 0x401431: main (calc.cpp:199)

错误1和3分别与2和4相同,除了初始地址以外。

这些错误是什么意思,我该如何修复它们?

 int main(){

    //Dlist is a double ended list. Each Node has a datum,
    //a pointer to the previous Node and a pointer to the next Node
    Dlist<double> hold;
    Dlist<double>* stack = &hold;

    string* s = new string;
    bool run = true;
    while (run && cin >> *s){

        char* c = new char;
        strcpy(c, s->c_str());   //valgrind errors here

        if (isdigit(c[0]))
            stack->insertFront(atof(c));

        else{
            switch(*c){
                //calculator functions
            }

        delete c;
        c = 0;
  }
delete s;
s = 0;

那问题是什么? - juanchopanza
你为什么要动态分配内存呢?在上述应用程序中没有必要这样做。 - Martin York
当您修复代码后,最好在codereview.stackexchange.com上发布帖子,以获取有关实现目标更好方式的意见。 - Martin York
4个回答

3

Valgrind会发出许多通常无害的警告,因为stdlib函数有一些小技巧,但是这里不是这种情况:

char* c = new char; // this is bad

只分配一个 char,而不是 char 缓冲区,请尝试:

char* c = new char[s->size()+1];

然后将删除更改为:
delete [] c;

3

char* c = new char; c的大小为1,即使要复制一个字符的字符串,也需要两个字符长的缓冲区(第二个字符用于保存空终止符)


2

就在这里:

    char* c = new char;

你只分配了一个字符。应该分配一个数组:

    char* c = new char[str->length() + 1];

请记得调用delete[]。您分配了+1的空间来容纳字符串的空结尾。

1
    char* c = new char;

您正在分配一个单个字符,然后将一个过长的字符串复制到该内存中,无法容纳。您需要分配足够大的数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接