簡體   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