информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Ошибочка 10.04.03 18:16  Число просмотров: 1194
Автор: Ktirf <Æ Rusakov> Статус: Elderman
Отредактировано 10.04.03 18:18  Количество правок: 1
<"чистая" ссылка>
Ключевым моментом является возвращение значения, как ты правильно понимаешь. return TESTCLASS(result) приводит к следующим действиям:

1. Создается новый объект TESTCLASS. В него копируется через new[] строка, переданная параметром (только что скопированная, замечу, и тоже через new[]).
2. Создается копия этого объекта при помощи конструктора копирования по умолчанию (поскольку сам ты его не определял). При этом на память, на которую ссылается указатель внутри старого объекта, ссылается и указатель внутри нового объекта (!)
3. Удаляется старый объект. В деструкторе вызывается delete[], в результате память, на которую ссылаются указатели И старого, И нового объекта, теперь заполнена мусором.
4. При выходе из функции теряется указатель result! (этого ты не заметил). Память, на которую он смотрел, больше недостижима, сиречь имеет место утечка памяти.
5. Копия объекта (т. е. новый объект) передается вызвавшей функции. К сожалению, указатель внутри него ссылается на мусор.

Итого имеем две ошибки. Теперь как это сделать правильно. Не знаю, почему ты не воспользовался std::string для хранения строки внутри TESTCLASS. Если особых причин нет, лучше используй его, тогда про управление памятью ты сможешь забыть. Если же особые причины есть, я могу тебе помочь написать все то же правильно, хотя верю, что ты и сам справишься теперь, когда знаешь ошибки.

Насчет конструктора копирования соображение тут было совершенно правильное. Лечением от указателя на мусор может быть так называемое "глубокое копирование", когда копируется не указатель, а память, на которую он указывает. Другими словами, вместо
ptr = old_object.ptr
должно быть
ptr = new char[length(old_object.ptr)]; copy(ptr, old_object.ptr);
Надеюсь, идея понятна.

Но с result проблема все равно остается, хотя она-то как раз решается совсем просто.

Напоследок: настоятельно рекомендую прочитать хотя бы Скотта Мейерса, "Эффективное использование C++", дабы боьше не делать подобных глупостей.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach