Я знакомлюсь с C++, и у меня возникла проблема с управлением памятью. В C, когда бы я не захотел зарезервировать память для любого количества элементов, независимо от типа, я бы просто вызвал malloc()
, а затем инициализировал вручную (через цикл) в зависимости от того, какое значение я хотел. С C++ new
все автоматически инициализируется.Выделение памяти без инициализации в C++
Проблема в том, у меня есть класс 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 от него. Проблема эта функция будет вызываться из функции, которая будет выделять массив из них:
BattleShip::BattleShip(BattlePoint start, enum shipTypeSize size, enum shipOrientation orientation) : size(size), orientation(orientation) {
points = new BattlePoint[size]; // Here be doubts.
}
Итак, мне нужна точка моего линкора провести массив BattlePoints, каждый из которых с различными значениями инициализаций (такие как 0,1, 0,2, 0,3 и т. Д.).
Вопрос: как я мог выделить свою память неинициализированной?
Джулиан,
PS: Я не сделал каких-либо испытаний в отношении пути new
работы, я просто читал Wikipedia's article on it, который говорит:
В языке программирования C++, а также во многих C++ основанный на языках, новый - это языковая конструкция, которая динамически выделяет память на куче и инициализирует память с помощью конструктора . За исключением формы, называемой «размещение нового», новый пытается выделить достаточное количество памяти в куче для новых данных. Если успешно, он инициализирует память и возвращает адрес в новую выделенную и инициализированную память . Однако, если новый не может выделить памяти в куче, он выдает исключение типа std :: bad_alloc. Это устраняет необходимость явно проверить результат распределения. Вызов для удаления, который вызывает деструктор и возвращает память , выделенную новой копией в кучу, должен быть сделан для каждого вызова нового во избежание утечки памяти.
Размещение нового должно быть решением, но в нем не упоминается, как это сделать.
P.S. 2: Я знаю, что это можно сделать с помощью векторного класса stdlib, но я избегаю этого специально.
Что не позволяет вам использовать malloc? –
Тот факт, что я использую C++, что заставляет меня хотеть использовать языковое решение. 'malloc' - это C. –
Это нормально, если вы хотите использовать строго языковые функции. Но malloc также является частью C++, как новый оператор. Как вы указали в своих комментариях, вы хотите избежать как векторных конструкторов stdlib, так и конструкторов по умолчанию. Итак, почему бы вам не использовать простой бросок и malloc? –