只需使用这段代码,您就会泄漏动态创建的卡片。
Card * c;
vector<Card> _shoe;
for( int i = 0; i < NUM_CARDS_IN_SHOE; i++ )
{
c = new Card();
_shoe.push_back( *c );
}
_shoe.push_back( *c )
adds a copy of the Card
指向的对象c
到向量Card
s。然后你就无法删除原来的Card
正如在之前的行中创建的那样。
分配向量NUM_CARDS_IN_SHOE
Cards
可以更简单地实现如下:
std::vector<Card> _shoe( NUM_CARDS_IN_SHOE );
看看你的卡片结构,看起来你在对象之间拥有(或几乎拥有)严格的所有权,所以我认为你不需要动态创建你的Card
s.
请注意您的局部变量_shoe
正在隐藏类变量_shoe
。作为本地人,这可能不是您想要的_shoe
你传递给Deck
构造函数将在构造函数末尾超出范围。
如果您对变量重新排序SolitaireGame
,你可能可以这样做:
class SolitaireGame:
{
public:
SolitaireGame( int numsuits = 1 );
private:
vector<Card> _shoe;
Deck _deck;
};
SolitaireGame::SolitaireGame( int numsuits )
: _shoe(NUM_CARDS_IN_SHOE)
, _deck(_shoe)
{
}
我已经改变了_deck
从成为一个指针。我使用的事实是成员变量是按照类定义中声明的顺序构造的,所以_shoe
在作为构造函数的引用传递之前将被完全构造_deck
。这样做的好处是我不再需要动态分配_deck
。没有使用new
,我知道我不能有任何未接来电delete
因为不需要显式地释放任何内容。
你是对的,你可以存储指向Card
s in _shoe
在你的_deck
没有任何内存管理问题,但请注意,您不得添加或删除任何Card
是在_shoe
在游戏的生命周期内,否则您将使所有指针无效_deck
.