我的代码中有struct Node,如下所示:
struct Node {
Node() : prev(0), left(0), right(0) {}
Node* prev;
Node* left;
Node* right;
char val;
};
我初始化Node structer对象的数组:
Node** pool = new Node*[10000000];
我认为它会使用defoult构造函数创建Node结构对象,但实际上数组似乎是空的。是否有任何有效的方法来创建一系列“空”对象?
答案 0 :(得分:5)
你应该使用std::vector<>
;没有理由在C ++中使用new
。
auto pool = std::vector<Node>(10000000);
(您的原始代码正在创建Node*
s,而不是Node
s。)
如果由于某种原因您不想使用vector
,则可以使用std::unique_ptr<>
。该代码将是
std::unique_ptr<Node[]> pool(new Node[10000000]);
但确实应使用vector
。
此外,您可以简化和改进Node
:
struct Node final {
Node* prev = nullptr;
Node* left = nullptr;
Node* right = nullptr;
char val = '\0';
Node(const Node&) = delete;
Node& operator(const Node&) = delete;
};
答案 1 :(得分:0)
如果您正在构建ast / asg并且不需要线性数据结构,那么您可以考虑使用::std::vector<>
批量分配内容,这可能会为您提供缓存局部性。
您仍然可以通过结构中的指针链接各个Node
对象。如果然后使用索引而不是指针,那么只要池中的可用对象用尽,您甚至可以调整向量的大小。
答案 2 :(得分:0)
Node** pool = new Node*[10000000];
构造一个Node*
而不是Node
的数组。你在寻找的是,
Node* pool = new Node[10000000];
构造一个Node
数组。如果你真的想要一个Node*
的数组,那么适当的初始化是,
int nObjects = 10000000;
Node** pool = new Node[nObjects];
for(auto i = 0; i < nObjects; ++i) {
pool[i] = new Node();
}
正如其他人所说,如果你可以避免使用new
或C风格的数组,你可能不想使用它。