Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка уничтожения объекта при дебаге

14K
07 сентября 2007 года
stimpi
100 / / 04.09.2007
в программе передаю строки по ссылке в функцию для экономии памяти, и работаю дальше с строками объявленными в мейне, при изменении строки в функции и попытке освободить память в мейне при дебаге вылетает. Если кто знает в чем причина поделитесь знаниями, заранее спасибо.
Код:
void MulStr(char*&,char*&,char*&);
void main()
{
    char *a = "123";
    char *b = "89";
    char *res = new char[strlen(a) + strlen(b)];

    if(res == NULL)
        cout << "Error" << endl;

    MulStr(a,b,res);
    delete res; // <- прога вылетает здесь при дебаге

}

void MulStr(char *&a,char *&b,char *&res)
{
    res = "142";
}
12K
08 сентября 2007 года
lifs
163 / / 06.09.2007
во-первых, после вызова функции res указывает на другую область памяти, а не на выделенную изначально, поэтому и ошибка;

во-вторых, следует писать delete[] res.
2.0K
08 сентября 2007 года
WidowMaker
212 / / 05.04.2005
Цитата: stimpi
в программе передаю строки по ссылке в функцию для экономии памяти,


Это как же?

Цитата: stimpi

и работаю дальше с строками объявленными в мейне, при изменении строки в функции


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

Цитата: stimpi
и попытке освободить память в мейне при дебаге вылетает.


Вылетит и так, а память статическая (const)

 
Код:
strcpy(res,[COLOR=seagreen]"142"[/COLOR]);

имхо, пожалуй, тебе лучше использовать std::string
[COLOR=gray]ЗЫ: в данном случае delete vs delete[] не смертельно.......[/COLOR]
309
09 сентября 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:

void MulStr(char *&a,char *&b,char *&res)


Дело в том, что char* - это не строка. Это всего лишь указатель на массив символов. Сам массив может находиться где угодно, поэтому в функцию передавать нужно именно указатель, а не ссылку на указатель.
Далее, использование символьных массивов в качестве строк, это одна из самых опасных операций в С++. Поэтому все компиляторы имеют один либо несколько классов, которые реализуют внутри себя все рутинные операции без какого-либо видимого уменьшения скорости работы программы.
А использование символьных массивов в учебных примерах только [bухудшит восприятие принципов С++

14K
09 сентября 2007 года
stimpi
100 / / 04.09.2007
разобрался, спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог