[英]Are new C++17 [[nodiscard]] warnings since Visual Studio 15.6.2 compiler update standards-compliant?
[英]alignment in new operator C++17 - Visual Studio
我在 Visual Studio 2017 C++17 中收到以下程序錯誤:
#include <iostream>
int main()
{
using namespace std;
align_val_t alignment = (align_val_t)1024;
int* p = new(alignment) int(3);
cout << (unsigned long long)(p) % 1024;
delete p;
}
錯誤 C2956 大小的釋放函數 'operator delete(void*, size_t)' 將被選為放置釋放函數
該程序在 gcc-8 中編譯沒有錯誤。 如何解決VS中的程序?
這是 MSVC 中的一個錯誤,不幸的是被關閉為“低優先級”: https ://developercommunity.visualstudio.com/t/using-c17-new-stdalign-val-tn-syntax-results-in-er/528320。
解決方法:
直接致電接線員:
int* p = static_cast<int*>(operator new[](sizeof(int) * 3, align_val_t{1024}));
但請注意,您還必須調用相應的operator delete[](void* ptr, std::align_val_t al)
。
如果您可以容忍尺寸為對齊倍數的煩人要求,請使用std::aligned_alloc
。
使用 MSVC 的非標准_aligned_malloc()
。 這必須與_aligned_free()
配對。
如果您使用的是 x86,請使用 immintrin.h 中的immintrin.h
_mm_malloc(size, align)
(或只是intrin.h
)。 這也必須與_mm_free()
配對,但可以在 Windows、Linux 和 MacOS 之間移植。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.