[英]C++ Allocating memory for buffer errors in free()
我需要将此数据的一些元组存储到缓冲区中。
"1444394028","1","5339","M","873"
"1444394028","1","7045","V","0.34902"
"1444394028","1","7042","M","2"
"1444394028","1","7077","V","0.0470588"
"1444394028","1","5415","M","40"
如您所见,记录的长度有所不同。 一行等于一条记录。 我已经写了这个函数:
std::string data_string = (record.asString());
char* data = (char*) malloc (data_string.length() );
std::copy( data_string.begin(), data_string.end(), data );
data[data_string.length()] = 0;
ressourceBuffer.push_back(data);
现在,我可以很好地使用缓冲区,但是如果我要释放内存,则会遇到错误。 我的免费功能如下:
/* free memory */
for (const char* b : ressourceBuffer) {
free ((char*) b);
}
我真的找不到解决方案,而且想法不多了。 它会产生此错误(这是stacktrace中大约50条的第一行):
*** Error in `./build-debug/bin/Test': free(): invalid next
size (fast): 0x00000000019b3cb0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7da1389d97e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7da1389e237a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7da1389e653c]
首先,正如注释中已经说过的那样,您不应该在C ++中使用malloc
。 该标准在某些方面没有得到考虑,这可能使使用起来很痛苦。 使用new
或最好是标准容器。 还可以通过C样式强制转换使用static_cast
和伴随广告。
第二:
data[data_string.length()] = 0;
在缓冲区末尾写一个。 令N
为data_string.length()
char* data = (char*) malloc (data_string.length() );
分配N
个字节,索引0
到N - 1
在分配的内存中。 因此, N
在分配的存储器之外。 但是,我不能保证这是您的问题。
这使我进入第三位:请发布一个最小的完整示例。 您提供的代码片段不足以真正说明正在发生的事情。 什么是ressourceBuffer
,例如什么是resource
。
您应该将文本行建模为结构:
struct Record
{
std::string field1; // Rename with column name
std::string field2;
std::string field3;
std::string field4;
}
接下来,重载operator>>
读取记录:
struct Record
{
//...
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
// Read column data until the ',' but don't put ',' into string.
std::getline(input, r.field1, ',');
std::getline(input, r.field2, ',');
std::getline(input, r.field3, ',');
std::getline(input, r.field4);
}
上面的代码使您可以使用std::vector
创建数据库并简化文件的读取:
std::vector<Record> database;
Record r;
while (my_data_file >> r)
{
database.push_back(r);
}
以上将简化数据库的创建。
另外,上面的代码允许您处理可变长度的记录。
通过使用std::vector
,您无需担心malloc
, free
, new
或delete
。 std::vector
处理内存分配,因此您不需要这样做。
稍后,您可能需要更改operator>>
方法,以将数字字段读取为数字,并从字符串中删除"
(请参阅std::string::find
和std::string::erase
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.