Разве неправильно использовать auto_ptr с новым символом [n]

Если вы хотите получить значение по умолчанию каждый раз, когда получаете доступ к неопределенному ключу в вашем объекте, вы делаете:

_.defaults(obj, {value: 37"})

или можете использовать стандартное сравнение:

if(typeof obj.a =='undefined'){
  return 37
}
14
задан David Sykes 4 November 2008 в 09:31
поделиться

7 ответов

Поведение вызова удаляет на указателе, выделенном с новым [], не определены . Как Вы предположили, auto_ptr действительно звонит, удаляют , когда интеллектуальный указатель выходит из объема. Это не просто утечки памяти, которые необходимо взволновать по поводу - катастрофические отказы и другие нечетные поведения возможны.

, Если Вы не должны передавать владение указателя, Повышение , класс scoped_array мог бы быть тем, что Вы ищете.

19
ответ дан 1 December 2019 в 06:11
поделиться

Я использовал бы вектор символа как буфер.

std::vector<char>    buffer(size);

read(input,&buffer[0],size);

В основном Вы даже не хотите называть новым, если Вы не должны.
вектор А предоставляет времени выполнения измеренный буфер, который можно использовать точно так же, как массив (буфер).

большая часть - то, что вектор моется после себя и стандарта гарантирует, что весь элемент в векторе будет в contigious устройстве хранения данных. Идеально подходящий для буфера.

Или более официально гарантия:

(&buffer[0]) + size == (&buffer[size])
10
ответ дан 1 December 2019 в 06:11
поделиться

Вызов удаляет на данных, выделенных с новым [], не определено. Это означает, что компилятор может сгенерировать код, который может сделать что-либо. Однако в этом случае это, вероятно, работает, так как нет никакой потребности разрушить отдельные символы в массиве, просто сам массив.

Все еще, так как это поведение не определено, я настоятельно рекомендовал бы использовать std::vector<char> или boost::scoped_array<char> / boost::shared_array<char> вместо этого. Все - совершенно жизнеспособные и превосходящие опции к использованию std::auto_ptr<> в этом случае. Если Вы используете std::vector, у Вас также есть возможность, динамично выращивают буфер при необходимости.

6
ответ дан 1 December 2019 в 06:11
поделиться

Есть ли серьезное основание не использовать станд.:: строка? станд.:: вектор, как другой предложили? То, что Вы делаете, неправильно, но не зная, что Вы пытаетесь сделать, рекомендация чего-то еще является трудной.

5
ответ дан 1 December 2019 в 06:11
поделиться

Это уступает, неопределенное поведение (могло быть хуже, чем утечка памяти, например, повреждение "кучи"), попытка scoped_array или shared_array повышения вместо этого.

7
ответ дан 1 December 2019 в 06:11
поделиться

Да, это неправильно. Перенеситесь с тривиальной оберткой.

typedef< typename T_ >
struct auto_vec{
  T_* t_;
  auto_vec( T_* t ): t_( t ) {}
  ~auto_vec() { delete[] t_; }
  T_* get() const { return t_; }
  T_* operator->() const { return get(); }
  T_& operator*() const { return *get(); }
  /* you should also define operator=, reset and release, if you plan to use them */
}

auto_vec<char> buffer( new char[n] );
4
ответ дан 1 December 2019 в 06:11
поделиться

Это кажется ужасным комплексом для очень простого решения. Что случилось с Вами использующий

 char *c=new char[n] 

здесь и затем удаляющий его? Или, если Вам нужно немного более динамическое решение,

vector<char> c

Бритва Оккама, друг. :-)

0
ответ дан 1 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: