Если вы хотите получить значение по умолчанию каждый раз, когда получаете доступ к неопределенному ключу в вашем объекте, вы делаете:
_.defaults(obj, {value: 37"})
или можете использовать стандартное сравнение:
if(typeof obj.a =='undefined'){
return 37
}
Поведение вызова удаляет на указателе, выделенном с новым [], не определены . Как Вы предположили, auto_ptr действительно звонит, удаляют , когда интеллектуальный указатель выходит из объема. Это не просто утечки памяти, которые необходимо взволновать по поводу - катастрофические отказы и другие нечетные поведения возможны.
, Если Вы не должны передавать владение указателя, Повышение , класс scoped_array мог бы быть тем, что Вы ищете.
Я использовал бы вектор символа как буфер.
std::vector<char> buffer(size);
read(input,&buffer[0],size);
В основном Вы даже не хотите называть новым, если Вы не должны.
вектор А предоставляет времени выполнения измеренный буфер, который можно использовать точно так же, как массив (буфер).
большая часть - то, что вектор моется после себя и стандарта гарантирует, что весь элемент в векторе будет в contigious устройстве хранения данных. Идеально подходящий для буфера.
Или более официально гарантия:
(&buffer[0]) + size == (&buffer[size])
Вызов удаляет на данных, выделенных с новым [], не определено. Это означает, что компилятор может сгенерировать код, который может сделать что-либо. Однако в этом случае это, вероятно, работает, так как нет никакой потребности разрушить отдельные символы в массиве, просто сам массив.
Все еще, так как это поведение не определено, я настоятельно рекомендовал бы использовать std::vector<char>
или boost::scoped_array<char> / boost::shared_array<char>
вместо этого. Все - совершенно жизнеспособные и превосходящие опции к использованию std::auto_ptr<>
в этом случае. Если Вы используете std::vector
, у Вас также есть возможность, динамично выращивают буфер при необходимости.
Есть ли серьезное основание не использовать станд.:: строка? станд.:: вектор, как другой предложили? То, что Вы делаете, неправильно, но не зная, что Вы пытаетесь сделать, рекомендация чего-то еще является трудной.
Это уступает, неопределенное поведение (могло быть хуже, чем утечка памяти, например, повреждение "кучи"), попытка scoped_array или shared_array повышения вместо этого.
Да, это неправильно. Перенеситесь с тривиальной оберткой.
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] );
Это кажется ужасным комплексом для очень простого решения. Что случилось с Вами использующий
char *c=new char[n]
здесь и затем удаляющий его? Или, если Вам нужно немного более динамическое решение,
vector<char> c
Бритва Оккама, друг. :-)