如何在类中初始化vector<type*>?自动内存管理及元素数量疑问
C++相关问题解答
问题1:如何在C++类中初始化vector<type*>类型的成员?
有几种常用的实现方式:
- 构造函数初始化列表:这是最推荐的方式,直接在构造函数的初始化列表中完成vector的初始化,能保证成员在对象构造时就处于有效状态:
class node { public: std::vector<node*> symbs; node() : symbs(26, nullptr) {} }; - 类内就地初始化:C++11及以后支持直接在成员声明时指定初始值,写法更简洁:
class node { public: std::vector<node*> symbs{26, nullptr}; }; - 构造函数体内动态初始化:如果需要根据构造参数动态调整vector的大小或内容,可以在构造函数体内调用
resize、push_back等方法:class node { public: std::vector<node*> symbs; node(int size) { symbs.resize(size, nullptr); } };
问题2:代码中node类的symbs成员被初始化为26个nullptr,但实际为何会有1000个元素?
你的main函数里仅声明了一个指针node *trees;,这个指针是未初始化的野指针,没有指向任何有效的node对象。当你尝试访问trees->symbs时,属于未定义行为——你读取的是随机内存区域的垃圾数据,看到的1000个元素和构造函数的初始化逻辑完全无关。
要让构造函数生效,必须创建真正的node对象:要么用new node分配堆对象,要么直接在栈上声明node trees;,这样构造函数才会被调用,symbs才会被正确初始化为26个nullptr。
问题3:使用node *trees = new node;创建对象,但不想手动清理内存,有什么其他实现方法?
有两种主流方案可以避免手动管理内存:
- 栈上创建对象:如果对象不需要在当前作用域外存活,直接在栈上声明对象即可,栈对象会在作用域结束时自动销毁:
node trees; - 使用智能指针:如果必须动态分配对象(比如需要长期存活、或作为容器元素等),可以用C++标准库的智能指针自动管理内存:
std::unique_ptr:独占式智能指针,适合单一所有权的场景:#include <memory> std::unique_ptr<node> trees = std::make_unique<node>();std::shared_ptr:共享式智能指针,适合多个对象共享所有权的场景:#include <memory> std::shared_ptr<node> trees = std::make_shared<node>();
delete。
内容的提问来源于stack exchange,提问作者Aleksandr Dots
相关产品推荐
相关产品推荐

