C++ 创建指向包含字符串的新类的指针

C++ 创建指向包含字符串的新类的指针,c++,armadillo,pimpl-idiom,C++,Armadillo,Pimpl Idiom,我认为new或智能指针需要内存大小。如果一个类包含字符串,我将分配该类。然后我给字符串分配一个新值,它是否在内存上 //a.hpp #包括 #包括 #包括 甲级{ 公众: A(const std::string&); 私人: 结构Impl; std::共享\u ptr impl; }; //抄送 结构A::Impl{ Impl(const std::string&f) { //读取配置文件并获取x的名称和大小 name=“abc”; x、 零(2,3); } std::字符串名; arma::m

我认为
new
或智能指针需要内存大小。如果一个类包含字符串,我将分配该类。然后我给字符串分配一个新值,它是否在内存上

//a.hpp
#包括
#包括
#包括
甲级{
公众:
A(const std::string&);
私人:
结构Impl;
std::共享\u ptr impl;
};
//抄送
结构A::Impl{
Impl(const std::string&f)
{
//读取配置文件并获取x的名称和大小
name=“abc”;
x、 零(2,3);
}
std::字符串名;
arma::matx;
};
A::A(常数std::string&f):
impl(std::make_shared(f)){

对于这个例子,我认为我只分配
N
内存,但我使用
N+M
内存。危险吗?

std::string的赋值运算符将负责所有所需的内存分配。你不必担心这一点。

Torbjorn的答案很好。我只是想补充几点


字符串类本身的大小必须有一定的值,您可以从
sizeof
获取该值。这就是您在自己的类中实际存储的内容。然后,对于存储在字符串中的数据,它是从字符串对象派生并由字符串对象管理的(它通常应该是某个指针(可能是字符串的起点),但我对此不确定)。因此,您不必担心它,标准库已经为您包装了它。

A
std::string
将分配存储该值所需的内存。完成后将其释放。您不必做任何事情。当您创建对象时,无论它是在堆栈上还是在堆上,正如Bo Persson所说,string构造函数为string对象分配内存,无论您以何种方式为字符串提供初始化,无论是通过默认初始化还是提供字符串。如果更改该值,以后将重新分配内存。你是否关心重新分配的问题取决于你。如果我错了,请有人纠正我。你确实为你的Pimpl结构提供了一个构造函数,但没有默认构造函数,因此你需要提供该值以进行分配。如果有人对内存消耗、分配等感兴趣,内存使用率高于核心类对象。但也许并非所有情况下都需要这些知识