繁体   English   中英

C ++为free()中的缓冲区错误分配内存

[英]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;

在缓冲区末尾写一个。 Ndata_string.length()

char* data = (char*) malloc (data_string.length() );

分配N个字节,索引0N - 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 ,您无需担心mallocfreenewdelete std::vector处理内存分配,因此您不需要这样做。

稍后,您可能需要更改operator>>方法,以将数字字段读取为数字,并从字符串中删除" (请参阅std::string::findstd::string::erase )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM