Исключения и конструктор копирования VC++

Вопросы по языкам программирования Си и С++.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Исключения и конструктор копирования VC++

Сообщение SLIM » 08.05.2011 (Вс) 20:27

Я раньше исключения не использовал в своей работе, тут захотелось наконец написать что-то нормальное.
Соорудил класс исключения
Код: Выделить всё
class FunctionalException
{
public:
   FunctionalException(DWORD dwErrorCode, LPTSTR pszErrSource, LPTSTR pszErrMessage, ...);
   DWORD GetErrorCode();
   LPTSTR GetErrMessage();
   LPTSTR GetErrSource();
private:
   DWORD dwErrorCode;
   LPTSTR pszErrMessage;
   LPTSTR pszErrSource;   
};


Генерирую исключение в где-то в коде
Код: Выделить всё
throw FunctionalException(666, TEXT("Хай пипл"), TEXT("1 "), TEXT("2 "), TEXT("3 "));


Все хорошо - исключение ловится. Но нужно еще освободить память под строки в классе исключения.
Определяем деструктор класса исключения.
Код: Выделить всё
~FunctionalException();

И прописываем ему
Код: Выделить всё
FunctionalException::~FunctionalException()
{
        MessageBox(NULL, TEXT("Деструктор"), GetErrMessage(), MB_OK);
   free(this->pszErrMessage);
}


Проверяем. Получается бред. Первое что бросается в глаза - дважды вызывается деструктор.
Проверяем this в деструкторе - получается вызывается деструктор для двух разных объектов.

Погуглил погуглил.
Нагуглил вот что
после вызова
Код: Выделить всё
throw FunctionalException(666, TEXT("Хай пипл"), TEXT("1 "), TEXT("2 "), TEXT("3 "));

Происходит уничтожение объекта, но перед этим копируется в вызывающий стековый фрейм с помощью конструктора копирования.
В итоге в
Код: Выделить всё
catch(FunctionalException& e)

Попадает уже не оригинал объекта, а его копия.
Ну а так как указатели копируются, деструктор освобождает строки при первом вызове, на втором вызове уже невалидные указатели.

Значит нужно переопределить конструктор копирования.
Код: Выделить всё
FunctionalException(const FunctionalException& OtherClass);

И код
Код: Выделить всё
FunctionalException::FunctionalException(const FunctionalException& OtherClass)
{
   MessageBox(NULL, TEXT("Копия"), TEXT("Hi"), MB_OK);
   dwErrorCode = OtherClass.dwErrorCode;
   pszErrMessage = OtherClass.pszErrMessage;
   pszErrSource = OtherClass.pszErrSource;
}


Запускаем - все работает. Деструктор вызывается один раз.
Но вот здесь то и вопрос. MessageBox "Копия" не появляется, отладить на конструкторе копий невозможно (не останавливается). Что бы я не передавал в переменные класса исключения - ему плевать (хоть пустые указатели передавай).

Почему не выполняется конструктор копирования, но тем не менее вроде бы все работает не понятно.

Помогите понять

UPD:: обновил
Последний раз редактировалось SLIM 09.05.2011 (Пн) 12:11, всего редактировалось 2 раз(а).
Пишите жизнь на чистовик.....переписать не удастся.....

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Исключения и конструктор копирования VC++

Сообщение Admiralisimys » 09.05.2011 (Пн) 0:52

SLIM потому что конструктору копирования не надо ничего передавать. Это копирования между объектами одного (или родственных) классов.

Вот пример приводящий разность между тремя конструкторами
Код: Выделить всё
#include <TCHAR.h>
#include <windows.h>
#include <stdio.h>

class TestClass
{
public:
   TestClass()
   {
      _tprintf(TEXT("Just for Fun\n"));
   }
   TestClass(const TestClass &OtherClass)
   {
      _tprintf(TEXT("Hallo\n"));
   }
   TestClass(const _TCHAR *szText)
   {
      _tprintf(TEXT("%s\n"), szText);
   }
};

int _tmain(int argc, _TCHAR *argv[])
{
   TestClass a;
   TestClass b = a;
   TestClass c(TEXT("Hello from out side"));
   return 0;
}

Совет по переносимости: лучше не использовать L"" в явном виде, взамен - макроподстановку TEXT("").

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Исключения и конструктор копирования VC++

Сообщение Хакер » 09.05.2011 (Пн) 5:56

Admiralisimys писал(а):Совет по переносимости: лучше не использовать L"" в явном виде, взамен - макроподстановку TEXT("").

Тут не переносимость, а откровенное нубство, использовать LPCTSTR и L. А иных случаях можно было наблюдать LPCWSTR и TEXT().

Oruginal тоже порадовал.

И вот это тоже:
SLIM писал(а):free(FunctionalException::pszErrMessage);

Вместо этого:
free(this->pszErrMessage);
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 09.05.2011 (Пн) 11:48

Хакер писал(а):Тут не переносимость, а откровенное нубство, использовать LPCTSTR и L. А иных случаях можно было наблюдать LPCWSTR и TEXT().

Да, это нубство, согласен.
Хакер писал(а):Oruginal тоже порадовал.

И вот это тоже:

SLIM писал(а):free(FunctionalException::pszErrMessage);


Вместо этого:
free(this->pszErrMessage);

С этим тоже согласен


Admiralisimys писал(а):Вот пример приводящий разность между тремя конструкторами

Так у тебя передается ведь
Код: Выделить всё
TestClass(const TestClass &OtherClass)
   {
      _tprintf(TEXT("Hallo\n"));
   }

Ровно так же как у меня
Конструктору копирования больше ничего не передаю
Пишите жизнь на чистовик.....переписать не удастся.....

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Исключения и конструктор копирования VC++

Сообщение Admiralisimys » 09.05.2011 (Пн) 13:06

SLIM примером хочу показать, что если нужно отладить конструктор копирования нужно создать два экземпляра класса. Одному из них присвоить ранее инициализированный объект, тогда будет вызван конструктор копирования. Насколько понял, именно этого и нужно было добиться.
отладить на конструкторе копий невозможно (не останавливается). Что бы я не передавал в переменные класса исключения - ему плевать (хоть пустые указатели передавай).

Сразу говорю, в исключениях не силён. По этому посчитал под фразой Что бы я не передавал в переменные класса путаницу параметризированного конструктора с конструктором копирования.
А тут наверное имелось виду какое исключения не генерировал, конструктор копирования во внутренней обработке не вызывается.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 09.05.2011 (Пн) 13:59

Admiralisimys писал(а):SLIM примером хочу показать, что если нужно отладить конструктор копирования нужно создать два экземпляра класса. Одному из них присвоить ранее инициализированный объект, тогда будет вызван конструктор копирования. Насколько понял, именно этого и нужно было добиться.

А. Нет, это то я проверил. Сам по себе конструктор копирования работает. Не работает при генерации исключения.
Admiralisimys писал(а):А тут наверное имелось виду какое исключения не генерировал, конструктор копирования во внутренней обработке не вызывается.

Ну отчасти да. Я имел в виду что конструктор копирования при генерации исключения не срабатывает, хотя в общем код начинает работать как должен.
Пишите жизнь на чистовик.....переписать не удастся.....

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Исключения и конструктор копирования VC++

Сообщение Александр Дмитриев » 10.05.2011 (Вт) 0:57

А можно весь код, если это возможно? Возможно, это может помочь нам помочь тебе.
Википедия — это наилучший источник информации по теме «Википедия».

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Исключения и конструктор копирования VC++

Сообщение Александр Дмитриев » 11.05.2011 (Ср) 23:56

SLIM? До полного кода нужен только конструктор и функция main(). Этот код зашифрован при помощи алгоритма стойкого шифрования, и последний человек, который знал секретный ключ, умер в один из двух последних дней? Этот код записан на носителе информации, физически находящемся на территории другого государства, и тебе отказывают в выдаче визы для въезда в это государство?
Википедия — это наилучший источник информации по теме «Википедия».

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 12.05.2011 (Чт) 18:20

:)
Ну погоди. Я сейчас пробую отладить, посмотреть дизасемблированный код, сравнить просто копирование и копирование при исключении. Вообще хочу понять происходит копирование ли вообще.

Сегодня отпишусь обязательно чего-нибудь.
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 14.06.2011 (Вт) 22:29

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

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 16.06.2011 (Чт) 22:26

Итак.
Выяснилось кое-что
Конструктор копирования срабатывает только если в исключение кидается указатель. Если кидается указатель, то и исключение ловится по ссылке. Но все это блин работает только если определен конструктор копирования. Если его нет - ошибка.
Пытаюсь все дизассемблировать, но мозгов то у меня совсем нет.
Помучаюсь дальше, может все таки докопаюсь до истины.
Пишите жизнь на чистовик.....переписать не удастся.....

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Исключения и конструктор копирования VC++

Сообщение Admiralisimys » 04.07.2011 (Пн) 13:09

SLIM а что если, в добавок, к конструктору копирование определить поведение в классе для операции присваивания? Ведь конструктор копирование срабатывает для не созданных объектов, а операция присваивание для ранее созданных.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 04.07.2011 (Пн) 18:33

Admiralisimys писал(а):SLIM а что если, в добавок, к конструктору копирование определить поведение в классе для операции присваивания? Ведь конструктор копирование срабатывает для не созданных объектов, а операция присваивание для ранее созданных.

Оператор присваивания я тоже переопределял. Оно не срабатывает.

Соль вопрос кроется где-то в истории операторов "&" со времен C.
Пишите жизнь на чистовик.....переписать не удастся.....

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.07.2011 (Пн) 21:17

Admiralisimys писал(а):конструктор копирование срабатывает для не созданных объектов, а операция присваивание для ранее созданных.

Конструктор копирования срабатывает при передаче аргумента по значению и инициализации при объявлении. Оператор присваивания вызывается только при присваивании.
Код: Выделить всё
int x=5;      // Конструктор копирования
abs(x);       // Конструктор копирования
int y(3);     // Конструктор копирования
int z; z=5;   // Оператор присваивания


SLIM писал(а):Соль вопрос кроется где-то в истории операторов "&" со времен C.

В C нет и никогда не было ссылок. Они есть только в C++.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.07.2011 (Пн) 22:04

Вообще-то, конструкторы копирования не должны так использоваться, но, всё же, предлагаю код, решающий Вашу проблему:
Код: Выделить всё
#include <cstdio>
#include <cstring>

#define INFO(s) puts(s)

class exception_normal
  {
  public:
    char *message;
   
    exception_normal(char *msg)
      {
      INFO("Constructor: exception_normal(char *msg)");
      message = new char[strlen(msg)+1];
      strcpy(message, msg);
      }
   
    exception_normal(const exception_normal &ex)
      {
      INFO("Constructor: exception_normal(const exception_normal &ex)");
      message = new char[strlen(ex.message)+1];
      strcpy(message, ex.message);
      }

    ~exception_normal()
      {
      INFO("Destructor: ~exception_normal()");
      delete[] message;
      }
  };

class exception_i_know_how_to_use_it
  {
  private:
    unsigned *count;
  public:
    char *message;
   
    exception_i_know_how_to_use_it(char *msg)
      {
      INFO("Constructor: exception_i_know_how_to_use_it(char *msg)");
      message = new char[strlen(msg)+1];
      count = new unsigned(1);
      strcpy(message, msg);
      }
   
    exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)
      {
      INFO("Constructor: exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)");
      message = ex.message;
      ++*(count=ex.count);
      }

    ~exception_i_know_how_to_use_it()
      {
      INFO("Destructor: ~exception_i_know_how_to_use_it()");
      if(!--*count)
        {
        delete count;
        delete[] message;
        INFO("Data is deleted");
        }
      }
  };

int main(void)
  {
  try
    {
    throw exception_normal("Normal");
    }
  catch(exception_normal ex)
    {
    puts(ex.message);
    }

  try
    {
    throw exception_i_know_how_to_use_it("I know...");
    }
  catch(exception_i_know_how_to_use_it ex)
    {
    puts(ex.message);
    }

  getchar();
  return 0;
  }
Output:
Код: Выделить всё
Constructor: exception_normal(char *msg)
Constructor: exception_normal(const exception_normal &ex)
Normal
Destructor: ~exception_normal()
Destructor: ~exception_normal()
Constructor: exception_i_know_how_to_use_it(char *msg)
Constructor: exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)
I know...
Destructor: ~exception_i_know_how_to_use_it()
Destructor: ~exception_i_know_how_to_use_it()
Data is deleted

Конструкторы копирования должны использоваться так, как показано в классе exception_normal, однако, если Вы полностью уверены в том, как Вы будете пользоваться копией, возможна реализация, показанная в exception_i_know_how_to_use_it. Последняя экономит память и время.

Передачу исключения по ссылке никогда не видел.

PS: Я за то, чтобы у программиста был выбор.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.07.2011 (Пн) 23:23

При добавлении
Код: Выделить всё
  try
    {
    throw exception_normal("Normal by ref");
    }
  catch(exception_normal &ex)
    {
    puts(ex.message);
    }

  try
    {
    throw exception_i_know_how_to_use_it("I know... by ref");
    }
  catch(exception_i_know_how_to_use_it &ex)
    {
    puts(ex.message);
    }
получаем
Код: Выделить всё
Constructor: exception_normal(char *msg)
Normal by ref
Destructor: ~exception_normal()
Constructor: exception_i_know_how_to_use_it(char *msg)
I know... by ref
Destructor: ~exception_i_know_how_to_use_it()
Data is deleted

VS2010 Express

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 05.07.2011 (Вт) 20:56

Ну вот, теперь еще больше неразберихи...

Меняем new/delete на malloc (calloc)/free - получаем вилы.
По разному работают с памятью?
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 05.07.2011 (Вт) 21:16

Qwertiy писал(а):В C нет и никогда не было ссылок. Они есть только в C++.

Я в общем-то это в виду и имею. Исключения скорее всего не работают со ссылками
Qwertiy писал(а):Передачу исключения по ссылке никогда не видел.

А кто его передает по ссылке? Его по ссылке ловят
Qwertiy писал(а):PS: Я за то, чтобы у программиста был выбор.

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

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.07.2011 (Вт) 21:38

SLIM писал(а):Ну вот, теперь еще больше неразберихи...

Я рассчитывал, что Вы сможете воспользоваться идеей подсчёта числа объектов.

SLIM писал(а):Меняем new/delete на malloc (calloc)/free - получаем вилы.

При правильной замене на malloc/free результат не меняется:
Код: Выделить всё
#include <cstdio>
#include <cstring>
#include <cstdlib>

#define INFO(s) printf("[%p] "##s##"\n", this)

class exception_normal
  {
  public:
    char *message;
   
    exception_normal(char *msg)
      {
      INFO("Constructor: exception_normal(char *msg)");
      message = (char*)malloc((strlen(msg)+1)*sizeof(char));
      strcpy(message, msg);
      }
   
    exception_normal(const exception_normal &ex)
      {
      INFO("Constructor: exception_normal(const exception_normal &ex)");
      message = (char*)malloc((strlen(ex.message)+1)*sizeof(char));
      strcpy(message, ex.message);
      }

    ~exception_normal()
      {
      INFO("Destructor: ~exception_normal()");
      free(message);
      }
  };

class exception_i_know_how_to_use_it
  {
  private:
    unsigned *count;
  public:
    char *message;
   
    exception_i_know_how_to_use_it(char *msg)
      {
      INFO("Constructor: exception_i_know_how_to_use_it(char *msg)");
      message = (char*)malloc((strlen(msg)+1)*sizeof(char));
      *(count=(unsigned*)malloc(sizeof(unsigned)))=1;
      strcpy(message, msg);
      }
   
    exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)
      {
      INFO("Constructor: exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)");
      message = ex.message;
      ++*(count=ex.count);
      }

    ~exception_i_know_how_to_use_it()
      {
      INFO("Destructor: ~exception_i_know_how_to_use_it()");
      if(!--*count)
        {
        free(count);
        free(message);
        INFO("Data is deleted");
        }
      }
  };

int main(void)
  {
  try
    {
    throw exception_normal("Normal");
    }
  catch(exception_normal ex)
    {
    puts(ex.message);
    }

  try
    {
    throw exception_i_know_how_to_use_it("I know...");
    }
  catch(exception_i_know_how_to_use_it ex)
    {
    puts(ex.message);
    }

  try
    {
    throw exception_normal("Normal by ref");
    }
  catch(exception_normal &ex)
    {
    puts(ex.message);
    }

  try
    {
    throw exception_i_know_how_to_use_it("I know... by ref");
    }
  catch(exception_i_know_how_to_use_it &ex)
    {
    puts(ex.message);
    }

  getchar();
  return 0;
  }
Output:
Код: Выделить всё
[0012FE30] Constructor: exception_normal(char *msg)
[0012FF50] Constructor: exception_normal(const exception_normal &ex)
Normal
[0012FF50] Destructor: ~exception_normal()
[0012FE30] Destructor: ~exception_normal()
[0012FE3C] Constructor: exception_i_know_how_to_use_it(char *msg)
[0012FF40] Constructor: exception_i_know_how_to_use_it(const exception_i_know_how_to_use_it &ex)
I know...
[0012FF40] Destructor: ~exception_i_know_how_to_use_it()
[0012FE3C] Destructor: ~exception_i_know_how_to_use_it()
[0012FE3C] Data is deleted
[0012FE4C] Constructor: exception_normal(char *msg)
Normal by ref
[0012FE4C] Destructor: ~exception_normal()
[0012FE58] Constructor: exception_i_know_how_to_use_it(char *msg)
I know... by ref
[0012FE58] Destructor: ~exception_i_know_how_to_use_it()
[0012FE58] Data is deleted
За одно поменял макрос вывода информации:
Код: Выделить всё
#define INFO(s) printf("[%p] "##s##"\n", this)


SLIM писал(а):По разному работают с памятью?

Это вполне возможно, но не обязательно. Именно поэтому нельзя использовать один метод для выделения памяти, а другой для освобождения. Память должна освобождаться так же, как была запрошена. Кроме того, напоминаю, что new[] выделяет память в элементах, а malloc - в байтах. А ещё, new использует конструктор по умолчанию (или явно указанный), а malloc никак не инициализирует полученную память.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.07.2011 (Вт) 21:49

SLIM писал(а):
Qwertiy писал(а):В C нет и никогда не было ссылок. Они есть только в C++.

Я в общем-то это в виду и имею. Исключения скорее всего не работают со ссылками

Исключений в C тоже нет и не было. Вы пытаетесь привязать к C возможности, которые есть только в C++.
В VS2010 исключения работают со ссылками, что показано в моём коде.

SLIM писал(а):А кто его передает по ссылке? Его по ссылке ловят

Я это и имел в виду.

SLIM писал(а):
Qwertiy писал(а):PS: Я за то, чтобы у программиста был выбор.

Главное понять между чем и чем. Я и топик создавал чтобы выяснить это

Это была фраза, не имеющая принципиального отношения к этой теме. Сказал просто потому, что конструктор копирования подразумевает копирование всех данных с целью получения полной копии, с которой можно делать всё что угодно, не влияя на исходный объект. Однако, ничто не мешает использовать его как я показал, при этом изменения в копии будут сказываться на исходном объекте.

А вообще, именно за множество запретов я не люблю C#. Я считаю, что я должен делать так, как я считаю нужным, а не компилятор. Конечно, если в чём-то ошибся, то сам и виноват, но если не ошибся, а тебе говорят НЕЛЬЗЯ!, то это очень раздражает.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Исключения и конструктор копирования VC++

Сообщение SLIM » 05.07.2011 (Вт) 22:34

Qwertiy писал(а):Я рассчитывал, что Вы сможете воспользоваться идеей подсчёта числа объектов.

Концепция подсчета ссылок понятна. Это была первая идея когда впервые столкнулся с проблемой.
Qwertiy писал(а):При правильной замене на malloc/free результат не меняется:

Да, все верно. Это я не внимательный
Qwertiy писал(а):Это вполне возможно, но не обязательно. Именно поэтому нельзя использовать один метод для выделения памяти, а другой для освобождения. Память должна освобождаться так же, как была запрошена. Кроме того, напоминаю, что new[] выделяет память в элементах, а malloc - в байтах. А ещё, new использует конструктор по умолчанию (или явно указанный), а malloc никак не инициализирует полученную память.

Это все я знаю. Я просто...так мысли вслух

Остальное сейчас посмотрю. Спасибо за помощь

UPD:: Блин. Вот смотрю на свой класс исключений и на Ваш exception_normal - никаких отличий вроде бы. А Ваш работает а мой нет.
Пишите жизнь на чистовик.....переписать не удастся.....

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Исключения и конструктор копирования VC++

Сообщение Александр Дмитриев » 06.07.2011 (Ср) 20:54

SLIM писал(а):Если его нет - ошибка.
Какая ошибка?

SLIM писал(а):получаем вилы.
Какие вилы?

SLIM писал(а):А Ваш работает а мой нет.
Как проявляется его неработоспособность?

О каком коде вообще речь?

SLIM писал(а):А Ваш работает а мой нет.
А его код приведён в этом топике а твой нет.

Твой код как чупакабра. Никто его никогда не видел, но все пытаются понять, почему оно высасывает кровь из домашних животных.
Википедия — это наилучший источник информации по теме «Википедия».

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.07.2011 (Ср) 21:24

SLIM писал(а):UPD:: Блин. Вот смотрю на свой класс исключений и на Ваш exception_normal - никаких отличий вроде бы. А Ваш работает а мой нет.

Slim, пожалуйста, не надо так добавлять апдейты в сообщения. Я смотрю тему, когда вижу пометку о непрочитанных сообщениях, а не обновляю её страницу, чтобы проверить, не изменилось ли чего. Сейчас пять минут искал, откуда взялась цитата
Александр Дмитриев писал(а):
SLIM писал(а):А Ваш работает а мой нет.
Просто пишите ещё одно сообщение, если хотите, чтобы то что Вы написали увидели.


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList