繁体   English   中英

memset,带有新运算符的 memcpy

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

很明显,可以以任何有效方式( newmalloc甚至静态)分配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.

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