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对象的地址.它应该是指针吗?
问题出在这里
void cardHand::addCard(playingCard card) { theHand[nElems++] = &card; }
您存储将在addCard方法结束时销毁的临时卡对象的地址.
在析构函数中,您尝试再次删除它.
你有两个选择.
首先:让addCard接受卡片配置并new在addCard方法中创建您的卡片.
第二:通过指针接受卡,但是你的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并完全取消动态分配.