C++指针赋值疑问:vector<CreditCard*>赋值逻辑及new关键字作用
问题核心原因解答
- 你产生误解的核心是没搞清楚
new关键字的返回值类型:new 类名(构造参数)整个表达式的返回值是对应类的指针类型,而不是类对象本身,刚好和你定义的vector<CreditCard*>的元素类型完全匹配,不存在类型不匹配的问题。
new关键字的具体作用
在C++中使用new创建类实例时,会按顺序完成三件事:
- 在程序的**堆内存(自由存储区)**中申请一块大小刚好能容纳该类实例的内存空间
- 用你传入的构造参数调用对应类的构造函数,将刚申请的内存初始化为合法的类对象
- 返回指向这块堆内存的指针,指针类型和创建的类对应,也就是这里的
CreditCard*
所以你代码里的赋值操作,本质上是把new返回的指针存到vector的对应位置,vector里存的始终是指针,没有存实际的CreditCard对象,对象本身是存放在堆内存里的。
额外注意事项
通过new申请的堆内存不会在变量生命周期结束时自动释放,如果你后续不用这些CreditCard对象了,需要手动调用delete释放对应的指针,否则会出现内存泄漏:
// 释放示例 for (int i = 0; i < wallet.size(); ++i) { if (wallet[i] != nullptr) { delete wallet[i]; wallet[i] = nullptr; } }
现在工业界的C++项目中大多会使用智能指针(比如std::unique_ptr<CreditCard>)代替裸指针,不需要手动管理内存,能有效避免内存泄漏问题。教材里使用裸指针是为了更清晰地讲解指针和内存管理的底层逻辑。
内容的提问来源于stack exchange,提问作者kaiyu wei
相关产品推荐
相关产品推荐

