Что может сделать переменную поля устаревшей перед входом в деструктор при удалении объекта?Я искал ответ для этой проблемы, которую я имею на этом сайте, и наткнулся на это: Срок службы объекта закончился до вызова деструктора?
Что-то не складываетсявообще: если я объявил указатель на SomeClass
внутри другого WrapperClass
, когда я создаю WrapperClass
, мне нужно создать new SomeClass
и delete
при уничтожении оболочки.Это имеет смысл и работает до сих пор.Указатель все еще действителен и корректен в деструкторе, иначе, очевидно, я не смог бы его удалить.
Теперь моя проблема в том, что мои члены поля (и int, и указатель на массив SomeClass
) WrapperClass
- это мусор, когда я вызываю деструктор.Я проверил объект-оболочку сразу после создания, и данные в порядке.Оболочка на самом деле является указателем в другом Main
классе, и проблема возникает, когда я уничтожаю этот Main
(который разрушает обертку), но работает нормально, если я просто delete
обертка из другого метода в Main
.Моя паранойя привела меня к вышеупомянутому ответу, и теперь я совершенно сбит с толку.Кто-нибудь хочет пролить свет на то, что на самом деле здесь происходит?
РЕДАКТИРОВАТЬ: Node
это SomeClass
.
class WrapperException{};
class Wrapper {
private:
struct Node { /*....*/ };
int numNodes;
Node** nodes;
public:
Wrapper() : numNodes(0) { nodes = new Node*[SIZE]; }
Wrapper(const Wrapper& other) { throw WrapperException(); }
Wrapper& operator=(const Wrapper& other) { throw WrapperException(); }
~Wrapper() { //calling delete Main gets me here with garbage for numNodes and nodes
for(int i = 0; i < numNodes; i++)
delete nodes[i];
delete nodes;
}
};
class MainException{};
class Main {
public:
Main() { wrapper = new Wrapper(); }
Main(const Main& other) { throw MainException(); }
Main& operator=(const Main& other) { throw MainException(); }
~Main() { delete wrapper; }
private:
Wrapper* wrapper;
};