我可以在C ++中可靠地使用memset和memcpy运算符,并为内存分配了新的吗?
编辑:
是的,要分配本机数据类型
实施例
BYTE *buffer = 0;
DWORD bufferSize = _fat.GetSectorSize();
buffer = new BYTE[bufferSize];
_fat.ReadSector(streamChain[0], buffer, bufferSize);
ULONG header = 0;
memcpy(&header, buffer, sizeof(ULONG));
答案 0 :(得分:5)
只要您使用new来分配内置和/或POD类型,那么是的。但是,有这样的事情:
std::string * s = new string;
memset( s, 0, sizeof(*s) );
那么你会看到灾难。
我不得不问,为什么你和其他人似乎很迷恋这些功能 - 我不相信我曾经在我自己的代码中使用它们。使用std :: vector,它有自己的副本和赋值工具似乎是memcpy()更好的选择,我从来没有真正相信将一切设置为零的魔力,这似乎是memset的主要用途( )。
答案 1 :(得分:1)
是的当然,认为用new分配的内存取自“免费商店”,它仍然只是在应用程序内存地址空间中。 memset和memcpy只是简单地获取源和目标的地址参数,这些参数在技术上可以是应用程序地址空间中的任何地址。
事实上,一些标准库算法本身就是一个简单的memcpy(通过迭代器传送矢量源和目标副本)。
答案 2 :(得分:1)
取决于您分配的内容。如果您已分配POD(普通旧数据),即完成
char* p = new char[100];,那么是,它与malloc没有区别。如果您已分配了一个对象,则使用memcpy或memset可能会导致未定义的行为。
答案 3 :(得分:1)
您提到过使用memset,但您的代码没有调用它。
您可以利用该语言的功能来分配& memset all in one blast:
int someInts [256] = {0};
这将分配256个int的数组,并将每个整数设置为零,完成相同的操作:
int someInts[256];
memset(someInts, 0, sizeof(someInts));
...但可能更快,具体取决于编译器如何优化alloc-memset代码块。
答案 4 :(得分:0)
是的,你确实可以
这是memset
的规范实现(取自Android的libc):
void* memset(void* dst, int c, size_t n)
{
char* q = dst;
char* end = q + n;
for (;;) {
if (q < end) break; *q++ = (char) c;
if (q < end) break; *q++ = (char) c;
if (q < end) break; *q++ = (char) c;
if (q < end) break; *q++ = (char) c;
}
return dst;
}
很明显,dst
指针可以任何有效的方式分配(new
,malloc
,甚至是静态的 - memset
无关紧要。