2009-12-30 43 views
2

我可以在C++中可靠地使用memset和memcpy运算符,内存已分配到新运算符吗?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

为您只使用新分配的内置和/或POD类型,那么是。然而,像这样的事情:

std::string * s = new string; 
memset(s, 0, sizeof(*s)); 

那么你会看到灾难。

我要问,但是,为什么你和其他人似乎如此迷恋与这些功能 - 我不相信我曾经用他们自己的代码。使用std :: vector,它有自己的拷贝和赋值功能,似乎是memcpy()的一个更好的选择,我从来没有真正相信将所有东西都设置为零的魔力,这似乎是memset的主要用途( )。

+0

就我而言,这是因为我来自纯C语言,而且它似乎很实用。但当然,我会提出建议。 – Andres 2009-12-30 18:17:15

+0

@Neil,你如何初始化一个(说)整数数组为全零? – 2009-12-30 18:17:34

+1

@Elii - 首先,我为什么要?其次,std :: vector v(0,SIZE) – 2009-12-30 18:20:39

1

当然是的,想用新分配的内存从“免费商店”它仍然只是在应用程序内存地址空间拍摄。 memset和memcpy只需为源和目标获取地址参数,这些参数在技术上可以应用于应用程序地址空间中的任何地址。

事实上一些的标准库的算法蒸馏下降到一个简单的memcpy本身(矢量源和目标副本通过迭代器)。

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不在乎。

+0

很酷,但是这里的代码假设int总是4个字节。 – Andres 2009-12-30 18:15:54

+0

什么?不 - 再读一遍。 – 2009-12-30 18:16:54

+0

好的,对不起: - )...... – Andres 2009-12-30 18:18:11

1

取决于您分配的内容。如果您已经分配了POD(普通旧数据),即完成

char* p = new char[100];
那么是的,它与malloc没有区别。如果你已经分配了一个对象,那么使用memcpy或memset可能会导致未定义的行为。

1

你提到用memset,但你的代码没有调用它。

您可以利用语言的特点来分配& memset的都在一个爆炸:

int someInts [256] = {0}; 

这将拨出的256个整数组成的阵列,并设置每一个零,完成相同的:

int someInts[256]; 
memset(someInts, 0, sizeof(someInts)); 

...但可能更快,这取决于你的编译器将如何优化ALLOC-memset的代码块。

+0

还应该注意,零是不必要的,int int someInts [256] = {};'''' – avakar 2009-12-30 19:31:22

+0

@avakar:果然如此。我倾向于在编写自我记录代码时尝试包括零。 – 2009-12-30 19:32:55

+0

就我个人而言,我发现“{0}”令人困惑 - 数组的第一个元素的特别之处在于您明确指定了它的值?但是你的里程可能会有所不同。 – avakar 2009-12-30 20:50:31