簡體   English   中英

C ++合並2 wchar_t *

[英]C++ merge 2 wchar_t*

我有一個有趣的問題,我不確定為什么。

inline void mergeWChar(wchar_t*& dest, const wchar_t* source) {
    if (dest == nullptr) {
        dest = const_cast<wchar_t*>(source);
        return;
    }
    int size = wcslen(dest);
    wcscat_s(dest, size, source);
}
inline void test() {
    wchar_t* msg = nullptr;
    wchar_t* t = L"BLA.BLA.BLA";
    mergeWChar(msg, L"Ts is jut a phrase in order to test my function");
    mergeWChar(msg, t);
}

我正在嘗試制作一個將使用wcscat_s函數合並更難的2個wchar_t *的函數,但由於某些原因無法正常工作,並且我收到此錯誤消息。

在ConsoleApplication1.exe中的0x5D8C3A18(ucrtbased.dll)引發異常:0xC0000005:訪問沖突寫入位置0x0082DD60。

另外,我已經檢查了這兩個問題,對我沒有幫助。

wcscat_s問題

wcscat_s函數-緩沖區錯誤

我不能做什么

我有一些舊的代碼工作,我不能用一些類似的事情:

  1. wstring的
  2. to_wstring
  3. wchar_t var [size] <-無效。

這里:

mergeWChar(msg, t);

msg指向字符串文字L"Ts is jut a phrase in order to test my function" 您不能修改字符串文字。

你要這個:

inline void mergeWChar(wchar_t*& dest, const wchar_t* source) {
  if (dest == nullptr) {
    dest = const_cast<wchar_t*>(source);
    return;
  }

  wchar_t *newdest = (wchar_t*)malloc((wcslen(dest) + wcslen(source) + 1) * sizeof *newdest);
  wcscpy(newdest, dest);      // the *_s functions are useless here
  wcscat(newdest, source);    // as you know that newdest point to
                              // a long enough buffer
  dest = newdest;
}

免責聲明:為簡潔起見,此處不進行錯誤檢查。

問題的根源在於mergeWChar函數的不良設計以及const_cast<wchar_t*>的可疑使用,這基本上使您可以將指向常量字符串的指針分配給普通指針,然后再允許您修改該常量內存,最終失敗。

但是,此設計存在一個問題:您無法釋放分配的內存,因為dest指針不一定是已通過malloc繼承的指針。 因此,以下設計是更好的IMO:

inline void mergeWChar(wchar_t*& dest, const wchar_t* source) {
  int size = (dest ? wcslen(dest) : 0) + wcslen(source) + 1;
  wchar_t *newdest = (wchar_t*)malloc(size * sizeof *newdest);
  if (dest)
    wcscpy(newdest, dest);
  else
    newdest[0] = 0;
  wcscat(newdest, source);
  dest = newdest;
}

這樣,就不會出現難看的轉換,也不會出現指向常量內存的非const指針的mergeWChar ,並且您可以確保mergeWChar都可以釋放由mergeWChar修改的指針。 代價是您需要更多的內存。

用法示例:

...
wchar_t* msg = nullptr;
wchar_t* t = L"BLA.BLA.BLA";
mergeWChar(msg, L"Ts is jut a phrase in order to test my function");
mergeWChar(msg, t);
...
free(msg);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM