C++ 如何在C++;?

C++ 如何在C++;?,c++,memory,memory-management,C++,Memory,Memory Management,我有指针str: char* str = new char[10]; 我使用内存块str点来存储数据 如何为str指向的缓冲区分配更多字节,而不丢失缓冲区中存储的旧数据?您不能使用新的结构。为此,您需要使用良好的旧malloc、realloc和free(不要将malloc/realloc/free和new/delete混用)。使用std::string代替。它可以满足您的需要,而无需担心分配、复制等问题。您仍然可以通过c_str()函数访问原始内存 即使是std::vector也能很好地为您工

我有指针
str

char* str = new char[10];
我使用内存块
str
点来存储数据


如何为
str
指向的缓冲区分配更多字节,而不丢失缓冲区中存储的旧数据?

您不能使用
新的
结构。为此,您需要使用良好的旧
malloc
realloc
free
(不要将malloc/realloc/free和new/delete混用)。

使用std::string代替。它可以满足您的需要,而无需担心分配、复制等问题。您仍然可以通过c_str()函数访问原始内存


即使是
std::vector
也能很好地为您工作。

新建[]
另一个缓冲区,将数据复制到那里(使用
memcpy()
),然后
删除[]
旧的缓冲区,将新缓冲区地址分配给最初保存旧缓冲区地址的指针。

该函数就是您要搜索的。您必须使用malloc/free而不是new/delete来使用它

您必须分配一个不同的、更大的字符串数组,并将数据从str复制到新的字符串数组。

您可以使用realloc:
我想补充的是,这种方法并不是最受欢迎的C++方法(取决于你的需求,你可以使用代码> STD::向量< /代码>)。 你在问是否有可能在你已经停了几天的车上加一辆拖车

答案是,在C语言中,存在一种叫做realloc的东西,它允许您执行以下操作。 如果我已经有足够的地方添加我的拖车,请这样做。如果你没有把车停在另一个足够大的地方,这就相当于复制你的数据

换言之,您将获得强大且随机的性能点击

那么在现实世界中你会做什么呢?如果你知道你可能需要增加一些拖车到你的车,你可能会在一个更大的地方停车。当超过场地所需的尺寸时,你会把你的汽车和拖车移到一个有足够空间供未来拖车使用的地方


这正是STL的字符串和向量为您所做的。你甚至可以给他们一个提示的大小,你的期货预告片调用“储备”。使用STD::字符串可能是解决问题的最佳答案。

< P>如果你真的使用C++,最正确的解决方法是使用STD::vector。我假设您没有将该信息用作标准字符串,在这种情况下,您应该使用std::string(这是std::vector的一个特化,所以没什么大不了的)。您正在创建至少10个字符。这给了我一个提示,你可能非常确定你需要10个字符,但也许你需要更多。也许您担心的是分配和释放内存所涉及的性能问题。在这种情况下,您可以创建字符串,然后保留预期需要的估计容量,因此至少在达到该限制之前不会进行任何重新分配

int main()
{
    std::string s;
    s.reserve( 10 );
    // do whatever with s
}

正如其他人已经指出的那样,使用std::string或std::Vector将使您忘记复制、调整或删除保留内存。

实际上,您可以-new[]一个新缓冲区,复制数据,删除[]旧缓冲区。不是一行,但realloc()就是这样做的。@sharptooth:不完全是这样。操作系统(至少linux)将尝试在适当的位置实际增加内存。如果在分配的空间之后有足够的连续空间,则该操作将不会产生复制成本。@David Rodríguez-dribeas:是的-在实现方面-但OP并不坚持“不复制”,他只要求保留数据。@David:realloc行为会给许多程序员带来麻烦。调试编译中的IMHO realloc应该始终移动块,这样程序员就不会养成忽略其返回地址的习惯。请注意,
realloc
可能会默默地移动分配,从而使其他指针无效。您指出这一点是正确的。实际上,在C++程序中,我建议不要使用它(以前是C的一种引用,当我第一次回答时,它已经被编辑出来了)。你应该学习一些编程的过程。考虑使用<代码> STD::向量< /代码>,这将为FielNOOT提供,为什么这是被否决的。OP需要使用std::string/std::vector,或者需要使用malloc/realloc/free而不是new/delete分配内存。