我正在用c ++做一些工作,并遇到了这段代码:
char* intToChar(RandomObject o) {
string integerStr = to_string(o.toNumber());
char * integerChar = new char[integerStr.size()+1];
copy(integerStr.begin(), integerStr.end(), integerChar);
integerChar[integerStr.size()] = '\0';
return integerChar;
}
integerChar
将返回并按如下方式分配:
struct Field {
char *name;
char *value;
};
std::vector<Field> rowData;
Field field;
field.name = i->key;
field.value = intToChar(i->value);
rowData.push_back(field);
但我不会在任何地方看到他会释放integerChar
或field
对象......这是不是很糟糕?这会造成内存泄漏吗?
答案 0 :(得分:2)
简短回答:可能是的。 intToChar
分配内存,然后将其分配给field.value
。如果delete[]
没有field.value
(直接或间接),则会泄露内存。
答案 1 :(得分:1)
好吧,我发现代码同时使用string
(是std::string
)和char*
,这对我来说很奇怪。坚持string
并避免处理内存分配和释放。
string intToChar(int o)
{
return to_string(o.toNumber());
}
struct Field {
std::string name;
std::string value;
};
Field field;
field.name = i->key;
field.value = intToChar(i->value);
rowData.push_back(field);
答案 2 :(得分:0)
new
的每次使用都必须与delete
的使用相匹配。或者在这种情况下,delete[]
。所以,是的,如果delete[]
丢失,则内存泄露。
答案 3 :(得分:0)
您不必释放field
对象(在这种情况下它是在堆栈上创建的,因此通常在相应的线程结束时将被丢弃)但是{{1}的内存用integerChar
分配的,必须在某处解除分配。