Вы выделяете память без вызова конструктора или вызова деструктора, когда объект собирается быть удаленным.Это то, что new[]
и delete[]
делает для вас, поэтому используйте их - или еще лучше, используйте умные указатели - или даже лучше, стандартный контейнер, такой как std::vector
, чтобы сохранить объекты для вас.
Ваш код с добавленными недостающими частями:
#include <iostream>
#include <string>
struct Car {
std::string model;
Car() { std::cout << "ctor\n"; }
~Car() { std::cout << "dtor\n"; }
};
int main() {
const int nCars = 2;
// allocate memory
Car *list = (Car *)malloc(nCars * sizeof(Car));
// manually calling constructors
for(int i=0; i<nCars; ++i) {
new(&list[i]) Car();
}
// use objects here
// manually calling destructors
for(int i=0; i<nCars; ++i) {
list[i].~Car();
}
// freeing memory
free(list);
}
Сравните с использованием new[]
и delete[]
:
int main() {
const int nCars = 2;
// create cars
Car* list = new Car[nCars];
// use objects here
// delete cars
delete[] list;
}
Сравните с использованием контейнера:
int main() {
const int nCars = 2;
// create cars
std::vector<Car> list(nCars);
// use objects here
}