在这里使用指针向量是不必要的还是更糟,导致内存泄漏?

Bee*_*and 2 c++ pointers vector

我是一个相对较新的C++编程,但我是一个10年的C程序员,因此对指向对象的指针比对对象的引用更为舒服.

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

无论如何,我有一节课SolitaireGame:

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

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;
};
Run Code Online (Sandbox Code Playgroud)

Deck构造,花费的向量的参考Card对象(鞋,通常104卡)并按下指针到每个卡到它自己的指针的双端队列.

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

    while( iter != shoe.end() )
    {
        _cards.push_front( &(*iter) );
        iter++;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

鞋子是在SolitaireGame构造函数中创建的.一旦创建了动态创建的Card对象的向量- 然后我将对该向量的引用传递给构造函数.

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 );
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,鞋子将成为Card对象的实际内存的容器,Deck并且Columns只处理指向这些Card对象的指针.

CB *_*ley 15

只需使用这段代码,就可以泄漏动态创建的卡片.

Card * c;
vector<Card> _shoe;

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

_shoe.push_back( *c )将指向的对象的副本添加到s 的向量中.然后,您无法删除之前在该行中创建的原始文件.CardcCardCard

分配矢量NUM_CARDS_IN_SHOE Cards可以更简单地实现如下:

std::vector<Card> _shoe( NUM_CARDS_IN_SHOE );
Run Code Online (Sandbox Code Playgroud)

看看你的卡结构,看起来你有(或几乎拥有)对象之间的严格所有权,所以我认为你不需要动态创建你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)
{
}
Run Code Online (Sandbox Code Playgroud)

我已经变成_deck了指针.我使用的事实是成员变量是按照类定义中声明的顺序构造的,因此在_shoe将其作为对构造函数的引用传递之前将完全构造_deck.这样做的好处是我已经消除了动态分配的需要_deck.没有使用new,我知道我不能有任何未接来电,delete因为没有必要明确地解除分配.

你是对的,你可以在没有任何内存管理问题的情况下存储指向Cards in的指针,但请注意,你不能在游戏的生命周期中添加或删除任何s,否则你将使所有的指针无效._shoe_deckCard_shoe_deck