我已经对这个问题进行了很多搜索,并且我也发现了一些有趣的主题,但所有这些人都对std :: string :: assign感到满意,该函数也能够将要复制的字符数作为参数。我对这个函数的问题是,它不会执行任何检查,以确定是否已经遇到了终止null-它认真地采取给定的大小并像memcpy一样将数据复制到字符串的缓冲区中。这样就分配和复制了比必须完成的更多的内存。
这是我目前解决这个问题的方式,但是有一些额外的开销,我希望避免:
// Get RVA of export name
const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
sSRA nameSra = rva2sra(pED->Name);
// Copy it into my buffer
char *szExportName = new char[nameSra.numBytesToSectionsEnd];
strncpy(szExportName,
nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
nameSra.numBytesToSectionsEnd);
szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;
m_exportName = szExportName;
delete [] szExportName;
这段代码是我为PE二进制文件编写的解析器的一部分(确切地说是解析导出表的例程)。rva2sra将相对虚拟地址转换为PE节相对地址。 ExportDirectory_t结构包含二进制文件导出名称的RVA,这应该是以零结尾的字符串。但并不总是这样 - 如果有人想要省略终止零,则可能使我的程序运行到不属于该节的内存中,最终会崩溃(在最好的情况下...)。
实现这样一个函数自己也不是什么大问题,但我更喜欢C++标准库中已经实现了这个功能的解决方案。
std::string
不以 null 字符结尾。您是想要字符串的一个副本,还是只需要一个副本,包括第一个 null 字节之前的所有内容(可能存在或不存在)? - Seth Carnegie