[英]memset, memcpy with new operator
我可以在 C++ 中可靠地使用 memset 和 memcpy 运算符,并使用 new 分配内存吗?
编辑:
是,分配原生数据类型
例子
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));
只要您仅使用 new 来分配内置和/或 POD 类型,就可以。 但是,有这样的事情:
std::string * s = new string;
memset( s, 0, sizeof(*s) );
那么你就会看到灾难。
不过我不得不问,为什么你和其他人似乎对这些函数如此着迷——我不相信我曾经在自己的代码中使用过它们。 使用具有自己的复制和赋值功能的 std::vector 似乎是 memcpy() 更好的选择,而且我从来没有真正相信将所有内容都设置为零的魔力,这似乎是 memset() 的主要用途)。
是的,当然,虽然用 new 分配的内存是从“空闲存储”中获取的,但它仍然只是在应用程序内存地址空间中。 memset 和 memcpy 只是获取源和目标的地址参数,这些参数在技术上可以是应用程序地址空间中的任何地址。
事实上,一些标准库算法本身提炼成一个简单的 memcpy(矢量源和目标副本通过迭代器)。
是的,你确实可以
这是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;
}
很明显,可以以任何有效方式( new
、 malloc
甚至静态)分配dst
指针 - memset
并不关心。
取决于你分配了什么。 如果你已经分配了 POD(Plain Old Data),即完成
char* p = new char[100];那么是的,它与 malloc 没有什么不同。 如果您已经分配了一个对象,那么使用 memcpy 或 memset 可能会导致未定义的行为。
您提到使用 memset,但您的代码没有调用它。
您可以利用该语言的功能一次性分配和 memset:
int someInts [256] = {0};
这将分配一个包含 256 个整数的数组,并将每个整数设置为零,实现与以下相同:
int someInts[256];
memset(someInts, 0, sizeof(someInts));
...但可能更快,这取决于您的编译器将如何优化 alloc-memset 代码块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.