析构函数问题

The*_*uzz 1 c++ pointers destructor

这是我的addCard函数,它将一个playCard作为参数,然后将其自身的地址移交给一个分配给playCard对象的指针数组.

void cardHand::addCard(playingCard card) {
    theHand[nElems++] = &card;
} // addCard()
Run Code Online (Sandbox Code Playgroud)

现在,当我运行我的程序时它运行正常,但在调用析构函数时崩溃.

cardHand::~cardHand() {
    for(int c = 0;c<MAX;c++) {
        if(theHand[c] != NULL)
            delete theHand[c]; // here is the problem
    }
    delete [] theHand;
} // class destructor
Run Code Online (Sandbox Code Playgroud)

它崩溃是因为我只是在addCard函数中移交了playingCard对象的地址.它应该是指针吗?

Myk*_*yev 7

问题出在这里

void cardHand::addCard(playingCard card) { theHand[nElems++] = &card; }

您存储将在addCard方法结束时销毁的临时卡对象的地址.

在析构函数中,您尝试再次删除它.

你有两个选择.

首先:让addCard接受卡片配置并newaddCard方法中创建您的卡片.
第二:通过指针接受卡,但是你的cardHand的析构函数不能负责删除卡.删除将执行创建所有卡的Deck对象.


小智 6

当你说:

theHand[nElems++] = &card;
Run Code Online (Sandbox Code Playgroud)

您正在存储函数参数的地址,该参数实际上是一个局部变量.这总是一件坏事,在您的情况下,当您尝试删除它时会导致崩溃.

你可能想要这样的东西:

theHand[nElems++] = new playingcCard( card );
Run Code Online (Sandbox Code Playgroud)

但真正的解决方案是使用playCard的std :: vector并完全取消动态分配.