почему мы должны переопределить terminate ()? - PullRequest
0 голосов
/ 21 октября 2011

В моей программе на C ++ есть ошибка:

#include<iostream>
using namespace std;

 char* foo()
 {
    char * mystr = new char[6];
    mystr = "Hello";
    return mystr ;
 }
 int main()
 {

 char* myString =foo();
 printf("%s \n", myString);

 delete [] myString ;

 } 


  ==27472== Invalid free() / delete / delete[]
  ==27472==    at 0x4A07A12: operator delete[](void*) (vg_replace_malloc.c:409)
  ==27472==    by 0x4007EB: main (printHello.cpp:16)
  ==27472==  Address 0x4008f8 is not stack'd, malloc'd or (recently) free'd

Если я удаляю delete [] myString ;, это работает хорошо.

Я должен освободить память, выделенную в куче, верно?

Но почему я получил ошибку, если удаляю ее?

Спасибо

Ответы [ 2 ]

8 голосов
/ 21 октября 2011

Поскольку вы удаляете память, которую вы не распределили. Вы выделяете 6 байтов через «new», но затем вы переназначаете var «mystr» на совершенно другой указатель (статическая строка «Hello»), который не был выделен «new». Таким образом, вы пытаетесь «удалить» статическую строку «Hello», которая не была выделена вами в первую очередь. Вот исправление:

Измените эти строки:

 char * mystr = new char[6]; 
 mystr = "Hello"; 

К этому:

char * mystr = new char[6]; 
strcpy(mystr, "Hello");

В качестве альтернативы вы можете использовать "foo" просто " return" hello "; " и не удалять строку в main.

3 голосов
/ 21 октября 2011

myString не был размещен в куче - foo выделяет массив символов в куче, но затем вы отбрасываете указатель на него и возвращаете указатель на статическую строку (которой нет в куче)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...