2013-12-10 2 views
3

Мой код работает правильно и не имеет утечек памяти. Тем не менее, я получаю ошибки, valgrind:Использование strcpy() с динамической памятью

==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; 
+0

И в чем вопрос? – juanchopanza

+0

Почему вы динамически выделяете память? В приведенной выше заявке не должно быть никаких оснований. –

+0

Как только ваш код исправлен, вы, вероятно, должны опубликовать на codereview.stackexchange.com, чтобы узнать мнения о лучших способах достижения своей цели. –

ответ

3

Есть множество обычно безобидные предупреждений, Valgrind будет бросать из функций STDLIB, так как они «обмануть» немного. Но это не случай здесь:

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

только выделяет символ - не буфер символов, попробуйте:

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

, а затем изменить удалить, чтобы:

delete [] c; 
1
char* c = new char; 

Вы назначаете один символ , а затем копирование строки в эту память, которая слишком длинна для соответствия. Вам нужно выделить достаточно большой массив.

2

Прямо здесь:

char* c = new char; 

Вы только выделение одного полукокса. Выделите массив вместо:

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

также не забудьте называть delete [] вместо этого. Вы выделяете +1 для создания пробела для нулевого завершения строки.

3

char * c = новый символ; Размер c равен 1 и для копирования даже 1 символьной строки вам нужен буфер с двумя символами (2-й символ для хранения нулевого терминатора)

Смежные вопросы