std::cout << "Set range: "; std::cin >> range; shape **shapes_list = new shape*[range]; while (i != range) { shapes_list[i] = ShapeFactory::createShape(type); i++; } for (int i = 0; i < range; ++i) { shapes_list[i]->create(); } When freeing memory here, destructors of objects are not called.
for (int i = 0; i < range; ++i) { delete [] shapes_list[i]; } delete [] shapes_list; And here it is normally called
shape* s = ShapeFactory::createShape(1); delete s;