C++ 将自动_ptr与新字符一起使用是否错误[n]

C++ 将自动_ptr与新字符一起使用是否错误[n],c++,stl,memory-leaks,auto-ptr,C++,Stl,Memory Leaks,Auto Ptr,如果我使用声明临时自动删除字符缓冲区 std::auto_ptr<char> buffer(new char[n]); std::auto_ptr缓冲区(新字符[n]); 然后,当缓冲区超出范围时,会自动删除该缓冲区。我假设使用delete删除缓冲区 但是,缓冲区是使用new[]创建的,因此严格来说,应该使用delete[]删除缓冲区 这种不匹配有什么可能会导致内存泄漏?在分配了new[]的指针上调用delete的行为是错误的。正如您所设想的,当智能指针超出范围时,会自动执行pt

如果我使用声明临时自动删除字符缓冲区

std::auto_ptr<char> buffer(new char[n]);
std::auto_ptr缓冲区(新字符[n]);
然后,当缓冲区超出范围时,会自动删除该缓冲区。我假设使用delete删除缓冲区

但是,缓冲区是使用new[]创建的,因此严格来说,应该使用delete[]删除缓冲区


这种不匹配有什么可能会导致内存泄漏?

在分配了new[]的指针上调用delete的行为是错误的。正如您所设想的,当智能指针超出范围时,会自动执行ptr。你需要担心的不仅仅是内存泄漏,还有可能发生崩溃和其他奇怪的行为


如果您不需要转移指针的所有权,Boost的类可能就是您要查找的对象。

会产生未定义的行为(可能比内存泄漏更糟糕,例如堆损坏),请尝试替换。

对使用new[]分配的数据调用delete是未定义的。这意味着编译器可以生成可以执行任何操作的代码。但是在这种情况下,它可能会起作用,因为不需要销毁数组中的单个字符,只需要销毁数组本身


尽管如此,由于此行为尚未定义,我还是强烈建议使用
std::vector
boost::scoped_array/boost::shared_array
。在这种情况下,与使用
std::auto_ptr
相比,所有这些都是完全可行且优越的选项。如果您使用
std::vector
您还可以根据需要动态增长缓冲区。

我将使用字符向量作为缓冲区

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

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

是否有充分的理由不使用std::string?std::vector,正如其他人所建议的那样?你所做的是错误的,但是在不知道你想做什么的情况下推荐其他东西是很困难的。

对于一个非常简单的解决方案来说,这似乎非常复杂。你用这个有什么问题

 char *c=new char[n] 
在这里,然后删除它? 或者,如果您需要更具动态性的解决方案

vector<char> c
向量c
奥卡姆剃刀,伙计。:-)

是的,这是错误的。用一个微不足道的包装纸包装

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] );
typedef
结构自动{
T_u*T_u;
自动向量(T):T(T){
~auto_vec(){delete[]t;}
T_*get()常量{return T_;}
T_*运算符->()常量{return get();}
T_&运算符*()常量{return*get();}
/*如果您计划使用运算符=、重置和释放,还应该定义它们*/
}
自动向量缓冲区(新字符[n]);

自从提出这个问题以来,几年过去了

但我是通过搜索找到这一页的,所以我想我最好注意一下: std::unique_ptr,自动_ptr的C++11替代品,可以处理删除使用新[]创建的对象

有两个版本的std::unique_ptr:1)管理 单个对象(例如,分配了new)2)管理 动态分配的对象数组(例如,使用新[]分配)


关键是要保证删除。使用智能指针/数组可以安全地防止正常编程错误,并且在出现异常时能够足够智能地释放内存。直接使用C数组会导致内存泄漏。关键是我们要保证删除。因此,未包装的新产品不是一个好的答案。另一方面,std::vector是一个很好的答案,它不是特定于“MSDN”(尽管cl是该编译器的名称)吗?很公平。更新引用是一般的C++而不是微软STL特定的。其他答案在2008年第一次被问到时还不错,但现在auto_ptr早就被弃用了,我只希望没有新手上网冲浪者点击这个页面并认为他们需要boost或他们自己的包装器或其他任何东西,因为现在好的解决方案是在STL中免费的。
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] );