为什么std::auto_ptr不对数组进行支持?难道会有区别?

DarknessTM 2008-10-07 08:57:34
我觉得数组也是很常用的啊,尤其是char[],经常在缓冲区用到

那为什么当初 STL不把auto_ptr搞成
template<typename T, bool isArray = false>
class auto_ptr;

这样的?

那不是很容易就可以使用了
比如 单个的没区别
auto_ptr<char> c(new char);

数组
auto_ptr<char, true> ca(new char[xx]);

区别不就是在 析构函数里
if (isArray) delete [] p;
else delete p;
...全文
463 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
DDGG 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]
要是内置类型的数组的话,
直接
auto_ptr <char> ptr(new char[xx]);
这样也不会内存泄露的.
不过为啥不用vector <char> ?
[/Quote]

为什么 auto_ptr <char> ptr(new char[xx]); 也不会内存泄漏啊?
我在VC6下试了,没检测出来泄漏。
但是根据auto_ptr的说法应该是会泄漏才对,因为auto_ptr不会使用delete [] char啊。
once_and_again 2008-10-08
  • 打赏
  • 举报
回复
数组 实现多态很麻烦,
如果 typedef 数组,
然后动态 new,
释放的时候就麻烦了
iambic 2008-10-08
  • 打赏
  • 举报
回复
不好意思,弄出两篇一样的来……
iambic 2008-10-08
  • 打赏
  • 举报
回复
>我觉得记反的可能性小,再说已经有默认值了
有默认值就更麻烦了。等你想用array的时候就不知道该填true还是false了。而且个人觉得应该尽量在设计上避免用户误传多态数组。
>我最近就在大量使用缓冲用的char数组,泛型不见得是要OO的吧
只是说需求比较少,还没到标准库为之考虑纳入的程度。
>我只是需要智能指针的智能释放,不需要做Rang检查,很多时候不需要这个开销
不是很理解……
>std::string 明显不同于 char[],std::vector又多了不必要的开销。
同二,不是说没有需求,而是说std::sting和std::vector已经将需求降低了。

不管怎么说,boost已经实现了这个需求。
iambic 2008-10-08
  • 打赏
  • 举报
回复
>我觉得记反的可能性小,再说已经有默认值了
有默认值就更麻烦了。等你想用array的时候就不知道该填true还是false了。而且个人觉得应该尽量在设计上避免用户误传多态数组。
>我最近就在大量使用缓冲用的char数组,泛型不见得是要OO的吧
只是说需求比较少,还没到标准库为之考虑纳入的程度。
>我只是需要智能指针的智能释放,不需要做Rang检查,很多时候不需要这个开销
不是很理解……
>std::string 明显不同于 char[],std::vector又多了不必要的开销。
同二,不是说没有需求,而是说std::sting和std::vector已经将需求降低了。

不管怎么说,boost已经实现了这个需求。
DarknessTM 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 iambic 的回复:]
一、isArray这种bool参数,最容易让人记反。避免使用这种参数。
二、数组不能多态,使用各种smart pointer的场合比较少。
三、你的auto_array连数组长度都丢了,意义何在?
四、已经有std::string和std::vector了。
[/Quote]

我觉得记反的可能性小,再说已经有默认值了
我最近就在大量使用缓冲用的char数组,泛型不见得是要OO的吧
我只是需要智能指针的智能释放,不需要做Rang检查,很多时候不需要这个开销
std::string 明显不同于 char[],std::vector又多了不必要的开销。
DarknessTM 2008-10-08
  • 打赏
  • 举报
回复
所以最终我下载了boost安上……
DarknessTM 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 daidodo 的回复:]
如果用户乱传isArray参数怎么办?
[/Quote]

这个就站不住脚了,vector 还可以乱push auto_ptr 呢
hackers007 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 MagiSu 的回复:]
taodm出马,我没什么好说的了。

boost::share_ptr满足楼主要求。
[/Quote]

这个可以实现了
daidodo 2008-10-07
  • 打赏
  • 举报
回复
如果用户乱传isArray参数怎么办?
taodm 2008-10-07
  • 打赏
  • 举报
回复
注意那个“留”字。
DarknessTM 2008-10-07
  • 打赏
  • 举报
回复
我想知道的是为什么……
MagiSu 2008-10-07
  • 打赏
  • 举报
回复
taodm出马,我没什么好说的了。

boost::share_ptr满足楼主要求。
taodm 2008-10-07
  • 打赏
  • 举报
回复
楼主啊,你的这个想法C++标准库留给boost库来完成了。
htqx 2008-10-07
  • 打赏
  • 举报
回复

因为开发组下班时间到了。
  • 打赏
  • 举报
回复
要是内置类型的数组的话,
直接
auto_ptr<char> ptr(new char[xx]);
这样也不会内存泄露的.
不过为啥不用vector<char> ?
iambic 2008-10-07
  • 打赏
  • 举报
回复
一、isArray这种bool参数,最容易让人记反。避免使用这种参数。
二、数组不能多态,使用各种smart pointer的场合比较少。
三、你的auto_array连数组长度都丢了,意义何在?
四、已经有std::string和std::vector了。
太乙 2008-10-07
  • 打赏
  • 举报
回复
晕~~lz可以试试!
rollrock1987 2008-10-07
  • 打赏
  • 举报
回复
想当然
DarknessTM 2008-10-07
  • 打赏
  • 举报
回复
有点明白了,因为认为
auto_ptr< vector<T> > 足够代替数组……

当然也可能有其他原因


1994 年夏天。Greg Colvin 向 C++ 标准委员会提议名为 auto_ptr 和 counted_ptr 的类,它们和我们现在所说的 scoped_ptr 和 shared_ptr 非常相似。[Col-94] 在极少的几次全体委员会没有接受库工作组的建议的案例之一中,counted_ptr 被否决了,并出人意外地将所有权转让语义加入到 auto_ptr 中。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧