下面的代碼導致內存崩潰導致崩潰。我假設這是因爲delete pTestStateMachine
試圖刪除未在堆中分配的內存。那是對的嗎?添加到QStateMachine的QStates的內存管理
如果是這樣,是否暗示QStateMachine::addState(QAbstractState * state)
必須始終傳遞一個動態分配的內存?不幸的是Qt docs doesen't沒有指定任何這樣的條件。我在這裏錯過了什麼?
class CTestClass
{
public:
QState m_pTestState;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStateMachine *pTestStateMachine;
CTestClass TestClass;
pTestStateMachine = new QStateMachine();
pTestStateMachine->addState(&(TestClass.m_pTestState));
pTestStateMachine->setInitialState(&(TestClass.m_pTestState));
pTestStateMachine->start();
pTestStateMachine->stop();
delete pTestStateMachine;
return a.exec();
}
根據您的回答,我明白,如果應用程序刪除'QObject'說'QObjChild',它的父之前(說'QObjParent')超出範圍。然後,'QObjParent'的銷燬非常聰明,可以確定它的子QObjChild已經被破壞,並且不會執行任何破壞。那是對的嗎 ? –
但是我在這裏看到的一個陷阱是,如果應用程序依賴於'QObjParent'來刪除它的子QObject,那麼所有的父母都會'刪除pChildQObject',如果沒有動態分配pChildQObject,那將是一個問題。理想情況下,在添加子對象時註冊刪除者不是很好嗎 –
@Vivek如果子對象'QObject'沒有被動態分配,那麼確保父對象不在孩子身邊。這很簡單 - 你總是在控制之中,你只需要做正確的事情。 「在添加子對象時註冊刪除器不太好 - 」我不知道這意味着什麼。什麼刪除者?註冊在哪裏? ?? 「 –