我有指针str
:
char* str = new char[10];
我使用内存块str
指向来存储数据。
如何为str
指向的缓冲区分配更多字节,而不会丢失缓冲区中存储的旧数据?
答案 0 :(得分:17)
使用std :: string代替。它可以满足您的需要而无需担心分配,复制等。您仍然可以通过c_str()函数访问原始内存。
即使 std::vector<char>
也适合你。
答案 1 :(得分:8)
new[]
另一个缓冲区,在那里复制数据(使用memcpy()
),然后delete[]
旧缓冲区,将新缓冲区地址分配给最初持有旧缓冲区地址的指针
答案 2 :(得分:3)
您无法使用new
构造。为此,您需要使用好的malloc
,realloc
和free
(不要混用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可能是解决问题的最佳方法。