如何在C ++中为缓冲区分配更多内存?

时间:2010-03-12 08:57:04

标签: c++ memory memory-management

我有指针str

char* str = new char[10];

我使用内存块str指向来存储数据。

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

8 个答案:

答案 0 :(得分:17)

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

即使 std::vector<char> 也适合你。

答案 1 :(得分:8)

new[]另一个缓冲区,在那里复制数据(使用memcpy()),然后delete[]旧缓冲区,将新缓冲区地址分配给最初持有旧缓冲区地址的指针

答案 2 :(得分:3)

您无法使用new构造。为此,您需要使用好的mallocreallocfree(不要混用malloc / realloc / free和new / delete)。

答案 3 :(得分:1)

如果您真的使用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会让你忘记复制,调整大小或删除保留的内存。

答案 4 :(得分:0)

realloc功能正是您要搜索的功能。你必须使用malloc / free而不是new / delete来使用它

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您可以使用realloc:http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/ 我想补充一点,这种方法不是最受欢迎的c ++方法(根据您的需要,您可以使用std::vector<char>)。

答案 7 :(得分:0)

分配有点像寻找停车位。 您在这里询问是否可以在停放了几天的汽车上添加预告片。

答案是,在C中存在一个名为realloc的东西,允许你做以下事情。 如果我已经有足够的地方添加我的预告片,请执行此操作。如果没有停放在另一个足够大的拖车和汽车的地方,这相当于复制你的数据。

换句话说,你会获得强大的随机性能。

那么你会在现实世界中做些什么呢?如果您知道可能需要在车上添加一些预告片,那么您可能会将车停放在比需要更大的地方。当超过该地方所需的尺寸时,您可以将您的汽车和拖车搬到一个有利于未来拖车的地方。

这正是STL的字符串和向量正在为你做的事情。您甚至可以通过拨打“预订”来给他们一些期货预告片的大小。使用std :: string可能是解决问题的最佳方法。