0

以前可能会问过这个问题,但我找不到我需要的确切内容。

我的问题是,我有一个从 web 服务下载的数据加载的缓冲区。缓冲区采用 unsigned char* 形式,最后没有 '\0'。然后我有一个 poco xml 解析器需要一个字符串。

我尝试将它分配给字符串 valgrind 发现一些丢失的数据。(见下文)

这是代码:

DOMParser::DOMParser(unsigned char* consatData, int consatDataSize,
    unsigned char* lagData, int lagDataSize) {

Poco::XML::DOMParser parser;
std::string consat;
consat.assign((const char*) consatData, consatDataSize);
pDoc = parser.parseString(consat);
ParseConsat();
}

Poco xml 解析器确实有一个 ParseMemory ,它需要一个 const char* 和数据大小,但由于某种原因,它只是给了我分段错误。

更新:这是 valgrind 结果的一部分:

==11880== 12,272 bytes in 1 blocks are possibly lost in loss record 1,126 of 1,143
==11880==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==11880==    by 0x4491D05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc+$
==11880==    by 0x4493F6F: std::string::_M_mutate(unsigned int, unsigned int, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x4494109: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/libstdc++.$
==11880==    by 0x44941AD: std::string::assign(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x804DE03: DOMParser::DOMParser(unsigned char*, int, unsigned char*, int) (DOMParser.cpp:27)
4

2 回答 2

1

我的问题是如何获取非空终止为字符串的数据

使用适当的std::string构造函数,如下所示:

std::string( (const char*) consatData, consatDataSize);

几乎等效地,使用以下.assign()方法:

std::string consat;
consat.assign((const char*) consatData, consatDataSize);

我意识到这会导致泄漏等问题。

你意识到错误。字符串数据被复制到字符串中。没有泄漏。

注意:有人可能会说,“不要使用 C 风格的演员表! ”他们可能是对的。您可能应该reinterpret_cast<const char*>(consatData)改用。我保留了 C 风格的转换,因为它们可以工作,并且因为您的原始代码使用它。

于 2012-10-15T21:51:52.123 回答
0

这里有两个问题:首先,您的缓冲区不是以空值结尾的。第二,它的unsigned char而不是标准的char

指向的内存consatData来自哪里?您是在从 Web 服务读取数据之前分配它,还是由 Web 服务分配它?另外,是consatDataSize缓冲区的大小,还是 Web 服务读取的字节数?

看看您是否可以分配缓冲区,以便您有空间在最后自己添加空终止符。如果您控制缓冲区的大小(也就是说,如果您自己分配它并且只要求 web 服务写入它),那么只需分配一个额外的字节并在 web 服务告诉您它有多少字节时向其写入 null书面。否则,我无法想象一个服务不会终止它自己的字符缓冲区......也许你没有给它足够的存储空间?

然后,要将其转换为字符串,请遵循此 StackOverflow 线程。至少有两种建议的解决方案:创建一个std::string包含无符号字符(这可能会导致兼容性问题),或者将您的无符号字符转换为有符号字符并创建一个普通的 jane std::string

于 2012-10-15T21:33:49.553 回答