Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::auto_ptr<char> и массив char, можно ли? С++Builder 2009 
V
    Опции темы
Alca
Дата 13.1.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



С++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 иттераций - память не увеличивалась.
Вопрос решен.

Это сообщение отредактировал(а) Alca - 13.1.2009, 13:54


--------------------
PM WWW ICQ Skype Jabber   Вверх
Vyacheslav
Дата 14.1.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Alca
Дата 14.1.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

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

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


--------------------
PM WWW ICQ Skype Jabber   Вверх
Rififi
Дата 14.1.2009, 14:50 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



Alca, 
Не будет ли утечки памяти
будет не утечка памяти а UB
PM MAIL   Вверх
Alca
Дата 14.1.2009, 16:33 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

UB

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


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 14.1.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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?
PM MAIL Skype GTalk   Вверх
TiKKi
Дата 14.1.2009, 16:58 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А зачем вообще так делать? std::vector, по-моему, логичней использовать.
PM   Вверх
Alca
Дата 14.1.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Вообще-то я нашел этот кусок кода в хелпе от 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 - объём памяти осталася таким же.

Это сообщение отредактировал(а) Alca - 14.1.2009, 17:13


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 14.1.2009, 17:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(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

так делать нельзя
PM MAIL Skype GTalk   Вверх
Alca
Дата 14.1.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



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

Это сообщение отредактировал(а) Alca - 14.1.2009, 17:17


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 14.1.2009, 17:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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




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

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

Это сообщение отредактировал(а) Lazin - 14.1.2009, 17:22
PM MAIL Skype GTalk   Вверх
Alca
Дата 14.1.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



С этим яно. Спасибо.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Vyacheslav
Дата 14.1.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(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 пока левая библиотека.  Например, некоторые заказчики весьма неодобрительно смотрят  на применение левых библиотек.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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