Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > std::auto_ptr<char> и массив char


Автор: Alca 13.1.2009, 13:33
С++Builder 2009
Можно ли применять автопоинтер к массиву?
Код

//...
{
    std::auto_ptr<char> pszBuffer(new char[256]);
}
//...

Дестуктор класса автопоинтер (вызывается при выходе из блока):
Код

~auto_ptr()
    {    // destroy the object
    if (_Myptr != 0)
        delete (_Ty *)_Myptr;
    }

Не будет ли утечки памяти, т.к. применяеться оператор 
Код

delete 

вместо 
Код

delete []
?
P.S.
По ходу там дальше идет очистка памяти.
Проверил, сделал цикл на 1 000 000 иттераций - память не увеличивалась.
Вопрос решен.

Автор: Vyacheslav 14.1.2009, 13:33
И как память проверяли? CodeGuard?
Вообще так код писать нельзя. Неужели трудно свой строгий указатель написать специально для массивов.

Автор: Alca 14.1.2009, 13:44
Цитата

И как память проверяли

В диспетчере задач

Автор: Rififi 14.1.2009, 14:50
Alca, 
Не будет ли утечки памяти
будет не утечка памяти а UB

Автор: Alca 14.1.2009, 16:33
Цитата

UB

Это че за шняга?

Автор: Lazin 14.1.2009, 16:40
undefined behavior, вместо auto_ptr лучше использовать boost::scoped_array

Добавлено через 1 минуту и 4 секунды
Цитата(Vyacheslav @  14.1.2009,  13:33 Найти цитируемый пост)
строгий указатель

WTF is строгий указатель?

Добавлено через 1 минуту и 58 секунд
и зачем его писать если есть boost::scoped_array и boost::shared_array?

Автор: TiKKi 14.1.2009, 16:58
А зачем вообще так делать? std::vector, по-моему, логичней использовать.

Автор: Alca 14.1.2009, 16:59
Вообще-то я нашел этот кусок кода в хелпе от C++Builder 2009.

Добавлено @ 17:01
Код

#include <memory>       //for STL auto_ptr class

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int iFileHandle;
  int iFileLength;
  int iBytesRead;
  char *pszBuffer;
  if (OpenDialog1->Execute())
  {
    try
    {
      iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
      iFileLength = FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
//    pszBuffer = PChar(AllocMem(iFileLength+1));
      std::auto_ptr<char> pszBuffer(new char[iFileLength+1]);    //<<<<<<<<<<<<<<<<<<<
      iBytesRead = FileRead(iFileHandle, pszBuffer.get(), iFileLength);
      FileClose(iFileHandle);
      for (int i=0;i<iBytesRead;i++)
      {
        StringGrid1->RowCount += 1;
        StringGrid1->Cells[1][i+1] = pszBuffer.get()[i];
        StringGrid1->Cells[2][i+1] = IntToStr((int)pszBuffer.get()[i]);
      }
    }
    catch(...)
    {
      Application->MessageBox(
        L"Can't perform one of the following file operations: Open, Seek, Read, Close.",
        L"File Error", IDOK);
    }
  }
}

Цитата

undefined behavior

Ну я делал 1 000 000 иттераций и что-то не было никакого undefined behavior - объём памяти осталася таким же.

Автор: Lazin 14.1.2009, 17:11
Цитата(TiKKi @  14.1.2009,  16:58 Найти цитируемый пост)
А зачем вообще так делать? std::vector, по-моему, логичней использовать. 

ага, но хочется человеку использовать auto_ptr с указателем на массив
Цитата(Alca @  14.1.2009,  16:59 Найти цитируемый пост)
Ну я делал 1 000 000 иттераций и что не было никакого undefined behavior

нет, UB было smile

Добавлено через 1 минуту и 4 секунды
Цитата(Alca @  14.1.2009,  16:59 Найти цитируемый пост)
Вообще-то я нашел этот кусок кода в хелпе от C++Builder 2009

так делать нельзя

Автор: Alca 14.1.2009, 17:15
Насчет std::vector я согласен, что лучше. smile  smile 
Lazin, разъясни где оно (UB) было? 

Автор: Lazin 14.1.2009, 17:21

Цитата(Alca @  14.1.2009,  17:15 Найти цитируемый пост)
разъясни где оно (UB) было?  

во время удаления массива оператором delete вместо delete [], UB это когда результат работы кода не определен, он может работать так как предполагается, как в случае с delete, а может не работать так как предполагается, а может на одном компиляторе работать так, а на другом эдак, если у тебя в коде есть UB, то твоя программа может начать себя вести по другому после выхода новой версии твоего компилятора =)

Автор: Alca 14.1.2009, 17:36
С этим яно. Спасибо.

Автор: Vyacheslav 14.1.2009, 19:47
Цитата(Lazin @  14.1.2009,  16:40 Найти цитируемый пост)
WTF is строгий указатель?


Проcто имеет место быть у некоторых авторов уточняющая терминология, в которой  под strong pointer подразумевается  pointer, который подчиняется  правилу : в любой момент времени только один  строгий указатель может  владеть памятью, на которую он указывает. 
Цитата(Lazin @  14.1.2009,  16:40 Найти цитируемый пост)
и зачем его писать если есть boost::scoped_array и boost::shared_array? 

А зачем тащить boost, если от него  нужно всего написать небольшой простейший класс? STL - это обязательная составляющая  С++, boost пока левая библиотека.  Например, некоторые заказчики весьма неодобрительно смотрят  на применение левых библиотек.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)