【发布时间】:2011-12-26 00:47:07
【问题描述】:
我正在熟悉 C++,但我遇到了内存管理问题。在 C 中,每当我想为任意数量的元素保留内存时,无论类型如何,我都会调用malloc(),然后手动(通过循环)初始化为我想要的任何值。使用 C++ 的new,一切都会自动初始化。
问题是,我有一个 BattlePoint 类,它有点像这样:
class BattlePoint {
public:
BattlePoint(int x, int y) : x(x), y(y) { };
bool operator==(const BattlePoint &right);
virtual ~BattlePoint();
private:
int x, y;
};
如您所见,它通过初始化程序获取一些 x 和 y 值,然后从中设置自己的 x 和 y。问题是,这个函数将从一个分配它们的数组的函数中调用:
BattleShip::BattleShip(BattlePoint start, enum shipTypeSize size, enum shipOrientation orientation) : size(size), orientation(orientation) {
points = new BattlePoint[size]; // Here be doubts.
}
所以,我需要我的 BattleShip 点来保存一系列 BattlePoints,每个 BattlePoints 都有不同的初始化值(例如 0,1;0,2;0,3,等等)。
问题是:我如何分配未初始化的内存?
朱利安,
P.S.:我还没有对new 的工作方式进行任何测试,我只是简单地阅读了Wikipedia's article on it,上面写着:
在 C++ 编程语言中,以及在许多基于 C++ 的 语言,new 是一种动态分配的语言结构 堆上的内存,使用 构造函数。除了一种叫做“安置新”的形式,新 尝试在堆上为新数据分配足够的内存。如果 成功,它会初始化内存并将地址返回给 新分配和初始化的内存。但是,如果 new 无法分配 堆上的内存它将抛出 std::bad_alloc 类型的异常。 这消除了显式检查分配结果的需要。 调用delete,调用析构函数并返回内存 由 new 分配回堆,必须在每次调用 new 时进行 以避免内存泄漏。
placement new 应该是解决方案,但它没有提到如何去做。
附: 2:我知道这可以通过stdlib的vector类来完成,但我故意避开它。
【问题讨论】:
-
什么会避免你使用 malloc?
-
我正在使用 C++,这让我想使用特定于语言的解决方案。
malloc是 C 的。 -
如果你想使用严格的语言特性也没关系。但是,malloc 也是 C++ 的一部分,很像 new 运算符。正如您在 cmets 中所述,您希望避免使用 stdlib 的向量和默认构造函数。那么,为什么不使用简单的强制转换和 malloc?
-
你有什么理由避免
std::vector?
标签: c++ memory new-operator