我应该删除一个取消引用的指针数组吗?
Should I delete an array of dereferenced pointers?
我不确定这是否是良好的编码实践,所以如果我错了,请纠正我。
我需要一种方法来动态创建一个事务类并将对象添加到事务对象的向量中。这是我所做的:
class Transaction {
int data;
Transaction(int d) : data(d) {}
};
class Container {
std::vector<Transaction> transactions;
void createTransaction();
};
void Container::createTransaction() {
int data;
std::cout << "Enter your data: ";
std::cin >> data;
Transaction t = new Transaction(data);
// In order to keep the object from destruction at end of function.
// Possibly could be done with static as well.
transactions.push_back(*t);
}
向量是对象的向量,而不是指针。在这种情况下,我不需要删除动态内存,因为它会在程序/范围结束时自行删除?
这是动态创建和存储对象的糟糕方法吗?
值语义适用:transactions.push_back(*t);
将在您的std::vector
中推送t
的副本。
所以你仍然需要删除分配给原始对象的内存:任何new
都必须通过调用 delete
来匹配。
您可能首先不需要new
,您只需执行以下操作:
Transaction t(data);
...
transactions.push_back(t);
注意:
正如 Matt 所指出的,Transaction t = new Transaction(data);
甚至没有编译,你可能的意思是Transaction* t = new Transaction(data);
您可以存储普通对象或指向矢量中的对象的指针。当您在堆上创建对象,然后在矢量中描写普通对象时,您将在两者之间的某个位置绘制线条。
问题是谁会删除这些对象?
默认情况下,将普通对象存储在矢量中。但是,如果对象的复制成本很高,或者没有正确的方法来定义对象的复制,或者您想要保留多态行为,则将指针存储到容器中。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题