gpt4 book ai didi

c++ - String.replace() 和动态内存

转载 作者:行者123 更新时间:2023-11-30 05:29:34 24 4
gpt4 key购买 nike

我知道 Arduino 的 String.replace 函数使用 realloc()。

我的“替换”函数构建一个字符缓冲区,然后将其分配给输入字符串,在动态内存分配方面是否更好?

我知道我一开始就不应该使用 String,但我暂时坚持使用它。

这是我的功能:

void replaceSubstr(String& in, String subin, String subout){

int s = in.indexOf(subin);

if(s > -1)
{
int a = in.length();
int b = subout.length();
int c = subin.length();
int len = (a + (b - c))+1;

char buff[len];
memcpy(buff, in.c_str(), s);
memcpy(&buff[s], subout.c_str(), b);
memcpy(&buff[s+b], in.substring(s+c).c_str(), a-(s+c));

buff[len-1] = '\0';
in = buff;
}
}

最佳答案

根据消息来源

String::String(const char *cstr)
{
init();
if (cstr) copy(cstr, strlen(cstr));
}
...
inline void String::init(void)
{
buffer = NULL;
capacity = 0;
len = 0;
}
...
String & String::copy(const char *cstr, unsigned int length)
{
if (!reserve(length)) {
invalidate();
return *this;
}
len = length;
strcpy(buffer, cstr);
return *this;
}
...
void String::invalidate(void)
{
if (buffer) free(buffer);
buffer = NULL;
capacity = len = 0;
}
...
unsigned char String::reserve(unsigned int size)
{
if (buffer && capacity >= size) return 1;
if (changeBuffer(size)) {
if (len == 0) buffer[0] = 0;
return 1;
}
return 0;
}

你的一行作业

 in = buff; 

也进行所有分配。

必须这样做,原始的 String 不能在不同的内存模型中保存 buffer,只有一个 'dynamic - allocated' 有意义。

从广义上看,许多 C 内存模型(堆栈、静态、由 new 分配,如果它们不同则由 calloc 分配)必须在现实生活库中减少 - 混合很危险。例如堆栈变量不能活得更久——必须复制到“已分配”。

你检查新的可能性,这很好,但我同意 Aconcagua 信任实现而不是替换原始内存模型。

来源:https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/WString.cpp

编辑:同意 const 参数等......

关于c++ - String.replace() 和动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36326399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com