无法取消引用插入到向量中的类对象指针

Posted

技术标签:

【中文标题】无法取消引用插入到向量中的类对象指针【英文标题】:Cannot Dereference Class Object Pointers Inserted Into a Vector 【发布时间】:2014-06-04 17:35:26 【问题描述】:
struct Tree_Node

    typedef int node_value_type;

    Tree_Node(node_value_type key) : value(key) 

public:
    node_value_type value = 0;
    Tree_Node* right = nullptr;
    Tree_Node* left = nullptr;
;

在将指向上述类的指针插入向量后,尝试弹出元素并取消引用它会给我在 Visual C++ 中的“访问冲突读取位置”异常。

vector<Tree_Node*> node_list(2);

Tree_Node* node1 = new Tree_Node(5);

node_list.push_back(node1);

cout << node_list.front()->value;

但是,以下工作正常:

Tree_Node* node2 = node1;

cout << node2->value << endl;

我在这里错过了什么?

请注意,我在同一范围内添加和访问矢量元素。此外,我还知道可能的内存泄漏和清理。我只是想知道为什么上面的代码不起作用

【问题讨论】:

【参考方案1】:
vector<Tree_Node*> node_list(2);

它创建一个带有两个空指针的向量。

node_list.push_back(node1);

它插入第三个元素

cout << node_list.front()->value;

它尝试访问第一个,它是一个空指针


要保留空间而不插入元素,请使用:

vector<Tree_Node*> node_list;
node_list.reserve(2);

但我几乎可以肯定默认 ctor 会为超过 2 个元素保留位置。

您还可以更新两个已分配的元素:

vector<Tree_Node*> node_list(2);
node_list[0] = node1;
node_list[1] = node2;

如果您想确保您的容器仅包含两个元素,请使用 std::pair 或(如果您可以使用 C++11)std::array

【讨论】:

我的错,一定是这样。我明确指定大小的原因是因为我想限制默认分配大小。基本上,我想要一个包含两个元素的空向量,我可以向其中添加两个指针。您认为最好的解决方法是什么?

以上是关于无法取消引用插入到向量中的类对象指针的主要内容,如果未能解决你的问题,请参考以下文章

通过指针、强制转换和取消引用加载向量?

无法从文件复制到指向对象的指针向量

当向量在内部类中时,如何删除指向对象的向量指针

C++中的指针和向量

从向量中删除取消引用的元素

C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?