当前位置:  开发笔记 > 编程语言 > 正文

将auto_ptr与new char [n]一起使用是错误的

如何解决《将auto_ptr与newchar[n]一起使用是错误的》经验,为你挑选了5个好方法。

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

std::auto_ptr buffer(new char[n]);

然后当缓冲区超出范围时自动删除缓冲区.我假设使用delete删除缓冲区.

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

这种不匹配可能导致内存泄漏的可能性有多大?



1> Stephen Veis..:

在使用new []分配的指针上调用delete的行为是未定义的.正如您所假设的,当智能指针超出范围时,auto_ptr 会调用delete.这不仅仅是你必须担心的内存泄漏 - 崩溃和其他奇怪的行为是可能的.

如果您不需要转移指针的所有权,Boost的scoped_array类可能就是您正在寻找的.



2> Martin York..:

我会使用char向量作为缓冲区.

std::vector    buffer(size);

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

基本上,如果你不需要,你甚至不想打电话给新人.
向量提供运行时大小的缓冲区,您可以像数组(缓冲区)一样使用它.

最好的部分是向量在其自身之后进行清理,并且标准保证向量中的所有元素将处于有余存储中.非常适合缓冲.

或者更合理的保证是:

(&buffer[0]) + size == (&buffer[size])



3> 小智..:

这会产生未定义的行为(可能比内存泄漏更糟,例如堆损坏)尝试使用boost的scoped_array或shared_array.



4> Andreas Magn..:

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

由于此行为未定义,我强烈建议使用std::vectorboost::scoped_array / boost::shared_array替代.std::auto_ptr<>在这种情况下,所有这些都是完全可行和优越的选择.如果您使用,std::vector您还可以根据需要动态增长缓冲区.



5> David Thornl..:

有没有理由不使用std :: string?std :: vector,正如其他人所建议的那样?你所做的是错的,但不知道你想要做什么推荐别的东西很难.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有