草庐IT

c++ - 如何通过析构方法删除一个对象(类)

我想知道是否可以通过析构方法删除一个对象?我的类的构造函数和析构函数:classcal{public:cal(){days=0;day=1;month=1;year=1300;leap=true;};~cal(){deletethis;}}*calendar=newcal;如何通过类删除这个指针?附言我忘了写下面的代码cal*calandar=newcal[];我想在堆而不是栈中使用它我想经常使用这个类(对象)(很多那个对象)想象一下我应该写多少次delete并且它很难理解,故障排除和跟踪代码我希望它们被自动销毁(在堆中)当我执行“delete[]calendar”时,我在类里面使用了

c++ - Valgrind 报告不匹配的 free()/delete/delete []

我正在编写一个可以在多个系统上运行的库(其中一些没有malloc或stdlib)。在我的标准库(不同的库)中,我覆盖了new和delete运算符以对函数进行通用调用(此示例没有这些函数)。每个系统都会将这些通用调用覆盖到它们各自的内存分配设备。问题是当我尝试这样做时。下面是一些精简的示例代码来重现该问题:#includevoid*operatornew(unsignedlongsize){returnstd::malloc(size);//wouldnormallycallanintermediatefunctionwhichwouldbeoverriddenbythesystem}v

c++ - C++ 标准中哪里说::delete 可以更改左值?

我遇到了我的第一个编译器,它更改了传递给::delete的左值,但没有将左值清零。以下是正确的:Foo*p=newFoo();Foo*q=p;assert(p!=0);assert(p==q);::deletep;assert(p!=q);assert(p!=0);请注意,删除操作后p不为零,它已从旧值改变。一位同事告诉我,根据他使用一些大型机C++编译器将p更改为0xFFFFFFFF以及将p更改为0的其他编译器的经验,这并不罕见。在C++标准中哪里说允许编译器这样做?通过StackOverflow搜索,我发现了这个问题:Whydoesn’tdeletesetthepointertoN

c++ - 第一次通话后断开插槽的优雅方式

在构造器内部,有一个连接:connect(&amskspace::on_board_computer_model::self(),SIGNAL(camera_status_changed(constamskspace::camera_status_t&)),this,SLOT(set_camera_status(constamskspace::camera_status_t&)));方法:voidcamera_model::set_camera_status(constamskspace::camera_status_t&status){disconnect(&amskspace::o

c++ - 如果我为一个类写new和delete运算符,我是否必须写所有它们的重载?

C++引用页列出了globalnewoperators的8种特定于类的重载。其中有四个是为2017版的C++添加的。类特定的分配函数void*T::operatornew(std::size_tcount);void*T::operatornew[](std::size_tcount);void*T::operatornew(std::size_tcount,std::align_val_tal);//(sinceC++17)void*T::operatornew[](std::size_tcount,std::align_val_tal);//(sinceC++17)特定于类别的展示

c++ - 为什么在析构函数中抛出异常时不调用重载删除?

我编写了以下代码,它重载了new和delete运算符并在析构函数中抛出异常。当抛出异常时,为什么delete操作符中的代码没有执行(并打印出“bye”)?如果不应该执行,(如何)释放内存?是oneoftheotherdeleteoperators叫什么?重载其中之一会导致执行相应的代码吗?还是内stub本没有被释放,因为破坏失败意味着它可能不应该被释放?#includeusingnamespacestd;classA{public:A(){}~A()noexcept(false){throwexception();}void*operatornew(std::size_tcount){

C++:如果我重载 new 运算符,我是否也必须重载 delete 运算符?

我正在阅读关于SO和answers中的一个问题,它被提到为:Ifnounambiguousmatchingdeallocationfunctioncanbefound,propagatingtheexceptiondoesnotcausetheobject’smemorytobefreed.因此,如果我只是重载我的new运算符而不是delete运算符,是否会创建和调用任何默认的delete运算符;或者,我是否还必须显式编写delete运算符。 最佳答案 这意味着如果你用额外的参数重载operatornew,而不是用额外的参数重载相应

c++ - 如何在多线程程序中定位 Valgrind 报告的 free/delete 不匹配?

这是Valgring报告:==14546==Thread5:==14546==Invalidfree()/delete/delete[]==14546==at0x490555D:free(vg_replace_malloc.c:235)==14546==by0x3BF7EFAA8F:free_mem(in/lib64/tls/libc-2.3.4.so)==14546==by0x3BF7EFA581:__libc_freeres(in/lib64/tls/libc-2.3.4.so)==14546==by0x4802676:_vgw_freeres(vg_preloaded.c:62)

C++ 语法 : default and delete modifiers

今天我偶然发现了这样一个代码片段:classA{A()=default;A(constA&)=delete;...}我从未见过delete或default关键字。它们是C++11标准的一部分吗?它们的用途是什么? 最佳答案 现在可以默认或删除特殊成员函数。已删除的成员函数仍然参与重载决议,但如果它被选中,则程序格式错误并且编译停止并提供有用的诊断。这是编写不可复制类之类内容的正确方法,并且用户会收到正确的错误消息。默认成员函数“做它应该做的”,例如默认的默认构造函数默认初始化所有基类和成员,并且主体为空;默认复制构造函数复制每个基对

【C++】:内存管理:C++内存分布 || C++中动态内存管理(new || delete)

📭1.C/C++内存分布【说明】🃏1.栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的🃏2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)🃏3.堆用于程序运行时动态内存分配,堆是可以上增长的。🃏4.数据段–存储全局数据和静态数据。🃏5.代码段–可执行的代码/只读常量我们先来看下面的一段代码和相关问题intglobalVar=1;staticintstaticGlobalVar=1;voidTest(){staticintstaticVar=1;intlocal