[英]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.