c++ - 为类字段中的指针分配空间
问题描述
当我的类中有 ptr 字段时,我无法理解何时在构造函数中使用 new 分配内存(使用 D'tor 中的 delete 结束释放它)。例如
class A {
private:
type* some_ptr;
public:
A(type* data):data(some_ptr);
~A();
}
或者应该是:
class A {
private:
type* some_ptr;
public:
A(type* data) { some_ptr = new type(data) };
~A(type* data) { delete data };
}
非常感谢你!
解决方案
- 我假设您想将构造函数中给出的指针存储在成员变量中
- 鉴于该类不是创建数据的人,该类不应删除它。也许指针也会在其他地方使用。
- 析构函数从来没有任何参数!
尝试:
class A {
private:
type* some_ptr;
public:
A(type* data) : some_ptr(data) {};
~A() {};
}
以下是您可能想要做的事情的列表:
在类中存储给定的指针:
class A {
private:
int* class_ptr;
public:
A(int* param_ptr) : class_ptr(param_ptr) {};
~A() {};
}
// Note: The Order is importand!
// Deletion is the reverse from creation
void main() {
int* int_ptr = new int(5);
A* a = new A(int_ptr);
delete a;
delete int_ptr;
}
如果要在构造函数中创建指向某些数据的新指针,可以这样做:
class A {
private:
type* some_ptr;
public:
A() : some_ptr(new type) {};
~A() { delete some_ptr; };
}
或者像这样,如果创建依赖于其他一些数据:
class A {
private:
type* some_ptr;
public:
A(othertype param) : some_ptr(new type(param)) {};
~A() { delete some_ptr; };
}
推荐阅读
- c# - 读取前修剪值
- mysql - Ejabberd 1000 虚拟主机是否可行?
- ssis - 连接到 KISAM ODBC 数据库的 SSIS 数据流包无法导出昨天的更改
- azure-devops - 以编程方式更新 AzDO 上的目标发布/部署组池
- python - 尝试使用带有两个头的 CSV 文件创建两个字典列表
- c# - 无法使用 MS Graph 将大文件上传到邮件草稿
- reactjs - Redux 调度操作未触发
- macos - List 中的 SwiftUI NavigationLinks 加载 NSViewDelegate/NSViewControllerDelegate 两次
- javascript - 如何通过在每个级别上具有不同排序函数的复杂决策树对数组进行排序?
- javascript - 正文滚动时隐藏固定标题