memset,memcpy with new operator

时间:2009-12-30 18:08:25

标签: c++ memory-management

我可以在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));

5 个答案:

答案 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指针可以任何有效的方式分配(newmalloc,甚至是静态的 - memset无关紧要。