gpt4 book ai didi

c++ - 运算符重载new和delete得到编译器错误

转载 作者:行者123 更新时间:2023-12-01 14:53:26 24 4
gpt4 key购买 nike

我正在尝试从编程书中执行有关“运算符重载”的代码示例。但是,我有以下错误:

invalid conversion from 'char' to 'void*' [-fpermissive]
char *p= new ('$') char[100];

这就是我重载 new 运算符的方式:
void *operator new(size_t sz,int setvalue)
{
void *p;

p=malloc(sz);
if(p==NULL){
memoryWarning();
}
memset(p,setvalue,sz);
return(p);
}


int main()
{
//rest of the code;
char *p = new ('$') char[100];
//rest of the code
}

构建期间的控制台输出:
21:39:21 **** Incremental Build of configuration Debug for project chapter5a ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -o "src\\chapter5a.o" "..\\src\\chapter5a.cpp"
cc1plus.exe: warning: command line option '-std=c99' is valid for C/ObjC but not for C++
<strong>..\src\chapter5a.cpp: In function 'int main()':
..\src\chapter5a.cpp:22:20: error: invalid conversion from 'char' to 'void*' [-fpermissive]
char *p= new('$') char;*
^~~~</strong>
In file included from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ext/new_allocator.h:33:0,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/i686-w64-mingw32/bits/c++allocator.h:33,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/allocator.h:46,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/string:41,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/locale_classes.h:40,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/ios_base.h:41,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ios:42,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ostream:38,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/iostream:39,
from ..\src\chapter5a.cpp:9:
C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/new:146:14:<strong> note: initializing argument 2 of 'void* operator new(std::size_t, void*)'
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
^~~~~~~~</strong>

21:39:21 Build Finished (took 703ms)

最佳答案

您重载了错误的运算符。

char *p = new ('$') char[100];

来电 operator new[] ,而不是 operator new ,因为它是一个数组新表达式。

所以你想重载
void *operator new[](size_t sz,int setvalue)

不是
void *operator new(size_t sz,int setvalue)

在实践中,您可能应该重载两者(您可以从 opearator new 调用 operator new[] )。

您还需要始终重载 operator deleteoperator delete[]当你重载 operator newoperator new[]分别。

不知道是什么 memoryWarning();可以,但请注意 operator new (和 operator new[] )没有非抛出异常规范必须抛出可以被 catch(std::bad_alloc) 捕获的异常当分配失败时。不允许返回空指针。

最后是 operator new您试图在这里形成的重载不会按照您的预期方式工作。
malloc不会在您分配的内存中创建任何对象。 memset (如果在这里甚至在技术上允许的话)会将字符写入该内存。然后新表达式将创建 char该内存中的数组。

新创建的对象不会具有它们之前所在的内存的值。而是 char 的值数组的元素将是不确定的,您将需要再次初始化它们。

在这里尝试的正确方法是不要重载 operator new ,但要手动初始化数组,最好不要使用 C 标准库函数 memset如果您没有充分的理由使用它。使用例如 std::fill相反(需要 #include<algorithm> ):
char *p = new char[100];
std::fill(p, p+100, '$');

或者更好,使用 std::string (需要 #include<string> ):
std::string str(100, '$');

指向底层 char 的指针数组可以从 str.data() 获得.

另外,不要使用 NULL .从 C++11 开始有 nullptr使用起来总是更安全。切勿使用 NULL , 始终使用 nullptr .

关于c++ - 运算符重载new和delete得到编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60507216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com