草庐IT

delete-operator

全部标签

c++ - 我如何在共享内存中使用运算符 `new` 和 `delete`?

我想使用共享内存在多​​个程序之间共享一些对象。我在thissite找到了示例.它没有任何对象分配,只是直接寻址,但我想在共享内存中创建结构或类。 最佳答案 因为内存已经分配好,你想使用placementnew:void*ptr=shmat(shmid,0,0);//HandleerrorsMyClass*x=new(ptr)MyClass;然后,MyClass的新实例将在ptr指向的内存中构造。当不需要该对象时,您必须手动调用析构函数(不释放内存)。ptr->MyClass::~MyClass();

解决win11中安装的ubuntu出现“System has not been booted with systemd as init system (PID 1). Can‘t operate. ”

"Systemhasnotbeenbootedwithsystemdasinitsystem(PID1).Can'toperate."翻译过来的意思是“系统尚未以systemd作为初始系统启动(PID1)。无法操作。”(图片我放不出来,因为我已经解决问题了,把配置关了,依然能正常运行)不都多说写这篇文章的时候,手机只有10度电了,还没洗澡,以下是开始尝试解决wsl配置方面的办法1.进入配置文件cd/etc/nanowsl.conf修改如图下  Ctrl+o保存Enter按回车确认文件名称Ctel+x退出第1步排查完成,如果能正常启动那问题已经解决了。2.WSL进行版本更新(如果修改配置文件还没

c++ - delete[] 是否释放整个内存块?

考虑以下几点:char*msg=newchar[20];msg[4]='\0';delete[]msg;delete[]msg是否释放了分配给msg的所有20个字符,还是仅释放了\0之前的那些字符?如果它只释放到\0,我怎样才能强制它删除整个内存块? 最佳答案 您问题中的原始代码具有未定义的行为,因为您将delete与new[]一起使用。我注意到您已通过将delete替换为delete[]来修复它:delete[]msg;这是正确的,并且会释放所有由new[]分配的内存。没有“删除到\0”或任何其他此类“部分”删除的概念。只能删除分

c++ - 重载 operator[] 从 1 开始和性能开销

我正在做一些C++计算力学(不用担心,这里不需要物理知识),有些事情真的让我很困扰。假设我想表示一个3D数学vector(与std::vector无关):classVector{public:Vector(doublex=0.,doubley=0.,doublez=0.){coordinates[0]=x;coordinates[1]=y;coordinates[2]=z;}private:doublecoordinates[3];};到目前为止一切顺利。现在我可以重载operator[]来提取坐标:double&Vector::operator[](inti){returncoord

c++ - 为什么要使用 new 和 delete?

我是C++的新手,我想知道为什么我还要费心使用new和delete?它可能会导致问题(内存泄漏),我不明白为什么我不应该在没有new运算符的情况下只初始化一个变量。有人可以向我解释吗?很难用谷歌搜索这个具体问题。 最佳答案 出于历史和效率原因,C++(和C)memorymanagement是明确的和手动的。有时,您可能会在callstack上分配(例如,通过使用VLAs或alloca(3))。然而,这并不总是可能的,因为堆栈大小有限(取决于平台,几千字节或几兆字节)。内存需求并不总是FIFO或LIFO.确实发生了您需要分配内存的情况

c++ - deleted 指针指向什么?

int*a=nullptr;//NULLbeforeC++11a=newint(1);deletea;a现在指向什么?它指向nullptr还是指向它在被删除之前指向的地址? 最佳答案 其他一些答案错误地说“值不会改变”。但是确实如此:删除前有效,删除后无效;这是一个变化。此外,值的表示也可能发生变化。例如,实现可以将a设置为null,或者调试器将识别的某种模式,以帮助检测变量的无效使用。 关于c++-deleted指针指向什么?,我们在StackOverflow上找到一个类似的问题:

C++ new 和 delete 以及字符串和函数

好的previous问题回答的很清楚,但是我发现了另一个问题。如果我这样做会怎样:char*test(intran){char*ret=newchar[ran];//process...returnret;}然后运行它:for(inti=0;i那么在将char*转为string之后,我就不用再为删除而烦恼了?编辑:正如回答的那样,我必须delete[]每个new[]调用,但在我的情况下这是不可能的,因为指针丢失了,所以问题是:如何正确地将char转换为string? 最佳答案 这里您不是转换char*为[std::]string,而

c++ - 为什么我必须调用 operator<< 作为 SFINAE 使用 void_t 的方法?

我正在尝试定义一个has_ostream_operatorSFINAE测试,用于检查我是否可以计算出给定的类型。我让它工作,但前提是在我对has_ostream_operator的定义中我调用operator作为一种方法而不是作为中缀运算符。换句话说,这是可行的:decltype(std::declval().operator()))>这不是:decltype(std::declval()())>下面的测试用例(也可以在http://coliru.stacked-crooked.com/a/d257d9d6e0f3f6d9看到)。请注意,我包含了void_t的定义,因为我只使用C++1

vscode重命名文件时卡住,错误信息Error: EPERM: operation not permitted, rename xxx -> xxx

本人小白,最近使用vscode编写学习设计动态网页时,发现无法重命名文件,并且vscode会卡住导致其他文件也无法访问,只能重启vscode,或是等设置的运行时长结束后弹出报错信息才会恢复。看了很多大佬的文章并尝试后也是药不对症。最后在不断的摸索下找到了我这种情况的问题所在,其实很简单“访问文件夹的权限不够”1.选中文件夹,首先保证文件夹的“只读”选项没有被选中,而未选中的默认状态就是黑色的方块 2.点击上方的安全,此时用户的权限应该是不完整的,并没有修改的权限3.我们更改权限即可,点击编辑,选择你想更改的组或用户名,下方的权限中点击完全控制,应用即可此时已经可以随意修改文件名了

c++ - `operator()...`在C++代码中是什么意思?

我试图理解std::visit的例子来自cppreference,在那里我看到了以下代码行:templatestructoverloaded:Ts...{usingTs::operator()...;};templateoverloaded(Ts...)->overloaded;我不明白。什么operator()...在代码中是什么意思? 最佳答案 我想用一些历史课来补充这里的好答案。这里有很多层,所以让我们一层一层地剥开它们。可变参数模板(C++11)参数包包装扩展using声明用于引入基类成员可变参数using声明(C++17)