В следующем коде:
class A {
};
class B : public A {
};
class C : public A {
int x;
};
int main (int argc, char** argv) {
A* b = new B();
A* c = new C();
//in both cases, only ~A() is called, not ~B() or ~C()
delete b; //is this ok?
delete c; //does this line leak memory?
return 0;
}
При вызове delete в классе с не виртуальным деструктором с функциями-членами (например, класс C) может ли распределитель памяти определить, что такое правильный размер объекта? Если нет, происходит утечка памяти?
Во-вторых, если класс не имеет функций-членов и никакого явного поведения деструктора (например, класс B), все нормально?
Я прошу об этом, потому что я хотел создать класс для расширения std::string
(который, как я знаю, не рекомендуется, но ради обсуждения просто нести его) и перегрузить +=
, +
оператор. -WeffС++ дает мне предупреждение, потому что std::string
имеет не виртуальный деструктор, но имеет ли значение, если подкласс не имеет элементов и не нужно ничего делать в своем деструкторе?
FYI перегрузка +=
заключалась в правильном форматировании пути к файлу, поэтому класс пути можно использовать как:
class path : public std::string {
//... overload, +=, +
//... add last_path_component, remove_path_component, ext, etc...
};
path foo = "/some/file/path";
foo = foo + "filename.txt";
std::string s = foo; //easy assignment to std::string
some_function_taking_std_string (foo); //easy implicit conversion
//and so on...
Я просто хотел убедиться, что кто-то делает это:
path* foo = new path();
std::string* bar = foo;
delete bar;
не вызовет проблем с распределением памяти?