В чем разница между этими двумя классами? - PullRequest
2 голосов
/ 25 марта 2009

Ниже я не объявляю my_ints указателем. Я не знаю, где будет выделена память. Пожалуйста, просветите меня здесь!

#include <iostream>
#include <vector>

class FieldStorage
{
private:
    std::vector<int> my_ints;

public:
    FieldStorage()
    {
        my_ints.push_back(1);
        my_ints.push_back(2);
    }

    void displayAll()
    {
        for (int i = 0; i < my_ints.size(); i++)
        {
            std::cout << my_ints[i] << std::endl;
        }
    }
};

И здесь я объявляю поле my_ints указателем:

#include <iostream>
#include <vector>

class FieldStorage
{
private:
    std::vector<int> *my_ints;

public:
    FieldStorage()
    {
        my_ints = new std::vector<int>();
        my_ints->push_back(1);
        my_ints->push_back(2);
    }

    void displayAll()
    {
        for (int i = 0; i < my_ints->size(); i++)
        {
            std::cout << (*my_ints)[i] << std::endl;
        }
    }

    ~FieldStorage()
    {
        delete my_ints;
    }
};

main() функция для проверки:

int main()
{
    FieldStorage obj;
    obj.displayAll();
    return 0;
}

Оба они дают одинаковый результат. Какая разница?

Ответы [ 11 ]

0 голосов
/ 25 марта 2009

В первом случае std :: vector помещается непосредственно в ваш класс (и он обрабатывает любое выделение и освобождение памяти, необходимые для увеличения и уменьшения вектора и освобождения памяти, когда ваш объект уничтожается; абстрагирование управления памятью от вас, чтобы вам не приходилось с ним сталкиваться). Во втором случае вы явно выделяете хранилище для std :: vector где-то в куче и забываете когда-либо удалить его, чтобы ваша программа пропустила память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...