创建对象以添加到指针数组的函数
Function that creates an object to add to an array of pointers
我有点困惑w.r.t。 delete
的使用和新对象的创建。假设我有一个 class 存储指向数组中其他对象的指针:
#include <array>
#include "someObject.hpp"
class someContainer() {
std::array<someObject*, 10> objects;
void set_object(int n);
}
在 set_object
函数中创建和存储 someObject
实例的最佳方法是什么 不 涉及使用智能指针或其他包装纸。
例如,我认为...
void someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject object* = &someObject(constructor_param);
objects[n] = object;
}
... 将导致未定义的行为,因为 object
引用的析构函数在函数退出时被调用。
那么正确的方法是这样吗?
void someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject object* = new someObject(constructor_param);
objects[n] = object;
}
void someContainer::~someContainer() {
int len = objects.size
for (int i=0; i < len; i++) {
delete objects[i];
}
或者是否有我遗漏的未定义行为? (此外,我认为不应该遍历数组同时从中删除对象,这就是我使用 len
索引的原因。这是真的吗?)我在这里问是因为编译和 似乎 工作得很好,但我很难真正知道。
这是内存管理中的一个重要问题:谁拥有分配的值,i。 e.谁负责释放它。如果你打电话
object[n] = new someObject(constructor_param);
并且已经有一个对象存储在那里,旧对象将保留在堆中的某个位置,可能没有任何指向它的指针,所以它永远无法再次被释放。
您可能希望 setter 看起来像这样:
someObject *someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject *previous = objects[n];
objects[n] = new someObject(constructor_param);
return previous;
}
向函数的用户发出他需要处理前一个对象的信号,要么立即delete
要么将其存储在某处。
此外,您可以完全自由地 delete
常规循环中的对象:请记住,您只是释放数组元素指向的对象,根本不会更改数组。
我有点困惑w.r.t。 delete
的使用和新对象的创建。假设我有一个 class 存储指向数组中其他对象的指针:
#include <array>
#include "someObject.hpp"
class someContainer() {
std::array<someObject*, 10> objects;
void set_object(int n);
}
在 set_object
函数中创建和存储 someObject
实例的最佳方法是什么 不 涉及使用智能指针或其他包装纸。
例如,我认为...
void someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject object* = &someObject(constructor_param);
objects[n] = object;
}
... 将导致未定义的行为,因为 object
引用的析构函数在函数退出时被调用。
那么正确的方法是这样吗?
void someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject object* = new someObject(constructor_param);
objects[n] = object;
}
void someContainer::~someContainer() {
int len = objects.size
for (int i=0; i < len; i++) {
delete objects[i];
}
或者是否有我遗漏的未定义行为? (此外,我认为不应该遍历数组同时从中删除对象,这就是我使用 len
索引的原因。这是真的吗?)我在这里问是因为编译和 似乎 工作得很好,但我很难真正知道。
这是内存管理中的一个重要问题:谁拥有分配的值,i。 e.谁负责释放它。如果你打电话
object[n] = new someObject(constructor_param);
并且已经有一个对象存储在那里,旧对象将保留在堆中的某个位置,可能没有任何指向它的指针,所以它永远无法再次被释放。
您可能希望 setter 看起来像这样:
someObject *someContainer::set_object(n) {
// Some check that 0 < n < 9
...
//=====
someObject *previous = objects[n];
objects[n] = new someObject(constructor_param);
return previous;
}
向函数的用户发出他需要处理前一个对象的信号,要么立即delete
要么将其存储在某处。
此外,您可以完全自由地 delete
常规循环中的对象:请记住,您只是释放数组元素指向的对象,根本不会更改数组。