标签:版本 span nes code ase cstring rgba with 指针
公司的C++工程迁移到了Centos8上面。现进行警告消除。发现如下警告。觉得挺有意思的记录一下。
Centos版本:
cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
Gcc版本:
gcc --version
gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
警告提示:
‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘class upoData’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
代码
memcpy ( &upoData[i] , &pData , sizeof ( UData ) ) ;
目前查出来的原因是,memcpy 会按照内存写入数据。并不会执行拷贝构造函数。当执行拷贝操作时,拷贝指向的类或者结构体如果存在指针,
并且指针指向了动态申请的对象或者数组。此指针将被拷贝源的指针覆盖。而当程序退出时,这部分被覆盖的数据将造成数据泄露。
这类警告应该属于编码错误。
示例程序如下:
1 #include <cstring> 2 3 struct A 4 { 5 A(int size) : size_(size), data_(new int[size]) {} 6 ~A() { delete [] data_; } 7 8 // The copy constructor and the copy assignment operator need 9 // to be implemented for the class too. They have been omitted 10 // to keep the code here minimal. 11 12 int size_; 13 int* data_; 14 }; 15 16 int main() 17 { 18 A a1(10); 19 A a2(20); 20 std::memcpy(&a1, &a2, sizeof(A)); 21 22 // When we return from the function, the original data_ of a1 23 // is a memory leak. The data_ of a2 is deleted twice. 24 25 return 0; 26 }
执行完拷贝时,此时a1.data_已经被a2.data_所覆盖,a1实例化时申请的int数组已经没有指针指向它(第五行代码)。程序退出时。这部分内存溢出。
解决方案,目前还没有决定用哪个:
1.重写类,使用拷贝构造函数,弃用memcpy。
优点,就应该这么办,缺点,工程量有点大,老代码,没有敢动。
2.MakeFile中添加[-Wclass-memaccess]将警告屏蔽。
优点,修改的时间快。
缺点,不讲武德,欺骗客户。
3.强制类型转换
memcpy ( &upoData[i] , &pData , sizeof ( UData ) ) ;---->memcpy ( (void*)&upoData[i] , (void*)&pData , sizeof ( UData ) ) ;
优点,修改的时间快。相比第二种看着舒服点。
缺点,也不太讲武德,有点欺骗客户和编译器感情。
目前调查出三种修改方案。具体采用哪种定下来再补充。
参考链接:
c++ - What uses are there for "placement new"? - Stack Overflow
c++ - Using std::memcpy to object of non-trivially copyable type - Stack Overflow
c++ - Avoid `-Wclass-memaccess` on memcpy of a POD type w/copy disabled - Stack Overflow
标签:版本 span nes code ase cstring rgba with 指针
原文地址:https://www.cnblogs.com/saikaimei/p/14396369.html