Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> new && delete, проблемы с удалением 
:(
    Опции темы
bel_nikita
Дата 11.3.2004, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Хелм ми, плиз
Проблемы с удалением
Код
struct sErrorString{
 std::string **ExtraString;
 std::string   String[5];
 sErrorString(){
   ExtraString=NULL;
 };
 sErrorString(char *aExtraString, char *aString1, char *aString2, char *aString3, char *aString4, char *aString5)
 {
   ExtraString = reinterpret_cast<std::string **>(aExtraString);
   String[0]   = aString1;
   String[1]   = aString2;
   String[2]   = aString3;
   String[3]   = aString4;
   String[4]   = aString5;
 }

// ВОТ ЗДЕСЬ ПРОБЛЕМЫ НАЧИНАЮТСЯ
 int InsertString(const int &NumStr,char const *Str)
 {
   if ( ExtraString==NULL )
   {
     ExtraString=new std::string*[5];
     memset(&ExtraString[0],NULL,5*sizeof(std::string*));
     for ( unsigned i=0; i<5; ++i )
       ExtraString[i]=new std::string(String[i]);
   }

  // ПОСЛЕ ЭТОГО ПРОГРАММА ВЫЛЕТАЕТ:
   if ( ExtraString[NumStr] )
   {
     delete ExtraString[NumStr];
     ExtraString[NumStr]=NULL;
   }
   ExtraString[NumStr]=new std::string(Str);
   return 0;
 }
 ~sErrorString()
 {
   if ( ExtraString ){
     for ( unsigned i=0; i<5; ++i )
       delete ExtraString[i];
     delete []ExtraString;
   }
 }
};

Что не правильно в коде?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Borisff2003
Дата 11.3.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 26.2.2004
Где: г. Уфа

Репутация: 1
Всего: 1



Цитата
ExtraString = reinterpret_cast<std::string **>(aExtraString);

А вот это зачем?
И что ты туда передаешь?, может там ерунда, вот delete и ругается

т.е. если ты передаешь туда
char *s;
организованный так,
s=new std::string*[5];
memset(&s[0],NULL,5*sizeof(std::string*));
for ( unsigned i=0; i<5; ++i )
s[i]=new std::string(String[i]);
то нормально, а ведь можно передать и такое
char *s="gdfgdfgdfg";
и это прекрастно пройдет, но до удаления указателя, просто передавай первым параметром NULL
и не мучайся

Это сообщение отредактировал(а) Borisff2003 - 11.3.2004, 11:59
--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 11.3.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



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

PS: кому интересно, конструктор копий:
Код
 sErrorString(const sErrorString &Copy)
 {
   String[0]   = Copy.String[0];
   String[1]   = Copy.String[1];
   String[2]   = Copy.String[2];
   String[3]   = Copy.String[3];
   String[4]   = Copy.String[4];
   if ( Copy.ExtraString )
   {
     ExtraString=new std::string*[5];
     memset(&ExtraString[0],NULL,5*sizeof(std::string*));
     for ( unsigned i=0; i<5; ++i )
       ExtraString[i]=new std::string(Copy.ExtraString[i]->c_str());
   }
   else ExtraString=NULL;
 }



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
srd
Дата 12.3.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата
std::string **ExtraString;


Может быть проще воспользоваться std::vector<std::string>? По крайней мере, не возникало бы подобных ошибок.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
bel_nikita
Дата 12.3.2004, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



srd Ты прав.
Я уже исправил на std::vector<std::string>.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1150 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.