gpt4 book ai didi

c++ - 在这里使用指针 vector 是不必要的还是更糟,导致内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 23:21:39 25 4
gpt4 key购买 nike

我是 C++ 编程的新手,但我是一名 10 年的 C 程序员,所以我对对象的指针比对对象的引用更熟悉。

我正在编写纸牌游戏 - 这种设计不安全吗?有没有更好的办法?

无论如何,我有一个类SolitaireGame:

class SolitaireGame:
{
public:
SolitaireGame( int numsuits = 1 );
private:
Deck * _deck;
vector<Card> _shoe;
};

Deck 是这样定义的:

class Deck:
{
public:
Deck::Deck( vector<Card>& shoe );
~Deck();
int DealsLeft() const { return deals_left; }
Card * PullCard();
private:
int deals_left;
int num_each_deal;
deque<Card *> _cards;
};

Deck 构造函数,引用一个 Card 对象的 vector (鞋子,通常有 104 张牌)并将指向每张牌的指针推送到它自己的 deque指针。

Deck::Deck( vector<Card>& shoe )
{
vector<Card>::iterator iter = shoe.begin();

while( iter != shoe.end() )
{
_cards.push_front( &(*iter) );
iter++;
}
}

鞋子是在 SolitaireGame 构造函数中创建的。一旦创建了这个动态创建的 Card 对象的 vector - 然后我将对此 vector 的引用传递给构造函数。

SolitaireGame::SolitaireGame( int numsuits ):_numsuits(numsuits ) 
{
Card * c;
vector<Card> _shoe;

for( int i = 0; i < NUM_CARDS_IN_SHOE; i++ )
{
c = new Card();
_shoe.push_back( *c );
}

_deck = new Deck( _shoe );
}

我的想法是,shoe 将成为 Card 对象的实际内存的容器,而 DeckColumns 只是处理指针那些 Card 对象。

最佳答案

只需使用这段代码,您就会泄露动态创建的卡片。

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 )添加 Card拷贝 c 指向的对象到 Card 的 vector 秒。然后您无法删除原始的 Card正如在之前的行中创建的那样。

分配 NUM_CARDS_IN_SHOE 的 vector Cards可以像这样更简单地实现:

std::vector<Card> _shoe( NUM_CARDS_IN_SHOE );

查看您的卡片结构,看起来您在对象之间拥有(或几乎拥有)严格的所有权,所以我认为您不需要动态创建 Card

请注意您的局部变量 _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 的指针在_shoe在你的_deck没有任何内存管理问题,但请注意,您不得添加或删除任何 Card_shoe 中在游戏的生命周期内,否则你将使 _deck 中的所有指针无效。 .

关于c++ - 在这里使用指针 vector 是不必要的还是更糟,导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com