我正在研究一个二维 vector ( vector 的 vector )来携带 C++ 中的一些指针。
std::vector< std::vector<object*> > data;
这里的对象是一个类,每个数据条目都携带一个指向对象实例的指针。我让它在 C++ 中工作,但是当我将其应用于其他代码时,内存管理使其难以维护。我做了一些研究,有人建议使用智能指针。我尝试下面的代码
#include <vector>
#include <memory>
using namespace std;
int main(void) {
vector< int > source = {1,2,3,4,5};
vector< auto_ptr<int> > co;
vector< vector< auto_ptr<int> > > all;
co.push_back( auto_ptr<int>(&source[0]) );
co.push_back( auto_ptr<int>(&source[2]) );
co.push_back( auto_ptr<int>(&source[4]) ); // it works well up to here
all.push_back(co); // but it crashs here
return 0;
}
错误消息之一是
C:/msys64/mingw64/include/c++/9.2.0/bits/STL_construct.h:75:7: 错误: 没有匹配的函数用于调用 'std::auto_ptr::auto_ptr(const std::auto_ptr& )'
75 | 75 {::new(static_cast
我想知道如何添加 vector< auto_ptr<int> >
到另一个 vector 或列表?
最佳答案
首先,不要使用std::auto_ptr
。正如您所发现的,它不能用作 vector 的元素,因为它没有适当的复制构造函数。自 C++11 起,它已被弃用,取而代之的是使用 std::unique_ptr。 std::auto_ptr
已从 C++17 中的语言中删除。
其次,&source[i]
指向的对象归source
所有。这些对象不属于该表达式生成的原始指针,甚至没有办法转移其所有权。因此,您不能将它们的所有权交给智能指针。如果这样做,一旦这些智能指针被销毁,程序的行为将变得不确定。
如果你想要一个智能指针 vector 的 vector ,这是一个正确的例子:
std::vector<std::unique_ptr<int>> co;
std::vector<std::vector<std::unique_ptr<int>>> all;
for (auto i : source) {
co.push_back(std::make_unique<int>(i));
}
all.push_back(std::move(co));
额外提示:
- 除非需要交换行,否则使用一维 vector 表示二维数组比使用 vector vector 更有效。
- 不必要的动态分配可能会代价高昂。鉴于 vector 元素本身已经在动态存储中,通常最好将对象直接存储为元素,而不是单独分配它们并存储智能指针。
关于c++ - 为什么 C++ 中 auto_ptr 的二维 vector 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65913577/