Я думаю, 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
памяти. Это опасно?
«std :: string» будет выделять память, необходимую для хранения значения. И отпустите его, когда закончите. Вам не нужно ничего делать. –
Когда вы создаете объект, будь он в стеке или куче, как сказал Бо Перссон, конструктор для строки выделяет память для строкового объекта, независимо от того, как вы обеспечиваете инициализацию для своей строки, будь то инициализация по умолчанию или предоставление строки. Если вы измените значение, то последующая память будет перераспределена. Будь вы заботитесь о проблеме перераспределения, зависит от вас. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь. – TimLayne
Вы предоставили конструктор и конструктор по умолчанию для своей структуры Pimpl, поэтому вам нужно будет предоставить это значение для его распределения. – TimLayne