2016-08-13 2 views
3

Я думаю, new или умный указатель нуждается в размере памяти. Если класс содержит строку, я выделяю класс. Затем я назначаю новое значение для строки, это над памятью?создать указатель на новый класс, который содержит строку

// a.hpp 
#include <string> 
#include <memory> 
#include <armadillo> 

class A { 
public: 
    A(const std::string &); 
private: 
    struct Impl; 
    std::shared_ptr<Impl> impl; 
}; 

// a.cc 
struct A::Impl { 
    Impl(const std::string &f) 
    { 
    // read config file and get name and size of x 
    name = "abc"; 
    x.zeros(2, 3); 
    } 

    std::string name; 
    arma::mat x; 
}; 

A::A(const std::string &f): 
    impl(std::make_shared<Impl>(f)) {} 

Для этого примера, я думаю, что я только выделить N память, но я использую N+M памяти. Это опасно?

+0

«std :: string» будет выделять память, необходимую для хранения значения. И отпустите его, когда закончите. Вам не нужно ничего делать. –

+0

Когда вы создаете объект, будь он в стеке или куче, как сказал Бо Перссон, конструктор для строки выделяет память для строкового объекта, независимо от того, как вы обеспечиваете инициализацию для своей строки, будь то инициализация по умолчанию или предоставление строки. Если вы измените значение, то последующая память будет перераспределена. Будь вы заботитесь о проблеме перераспределения, зависит от вас. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь. – TimLayne

+0

Вы предоставили конструктор и конструктор по умолчанию для своей структуры Pimpl, поэтому вам нужно будет предоставить это значение для его распределения. – TimLayne

ответ

1

Оператор присваивания std::string позаботится обо всех необходимых выделениях памяти. Вам не нужно беспокоиться об этом.

+0

, если кто-то заинтересован в потреблении памяти, распределении и т. Д., Использование памяти выше, чем объект основного класса. Но, возможно, это знание не требуется в каждой ситуации –

0

Ответ Торбьерна велик. Я просто добавлю дополнительные очки.

Сам класс строки должен иметь определенное значение в размере, которое вы можете получить от sizeof. Это то, что вы на самом деле храните в своем классе. Затем для данных, хранящихся в строке, это , полученных, и управляется строковым объектом (обычно это должен быть указатель (который может быть начальной точкой вашей строки), но я не уверен в этом). Так что вам не о чем беспокоиться, в стандартной библиотеке уже есть завернутый это для вас.

Смежные вопросы