Tag: delete operator

为什么GCC不能优化删除C ++中的空指针呢?

考虑一个简单的程序: int main() { int* ptr = nullptr; delete ptr; } 使用GCC(7.2),在结果程序中有一个关于operator delete的call指令。 使用Clang和Intel编译器,不存在这样的指令,空指针删除被完全优化(在所有情况下都是-O2 )。 你可以在这里testing: https : //godbolt.org/g/JmdoJi 。 我不知道这样的优化是否可以用GCC打开? (我更广泛的动机源于自定义swap与可移动types的std::swap的问题,在第二种情况下删除空指针可能代表性能损失;请参阅https://stackoverflow.com/a/45689282/580083细节。) UPDATE 为了澄清我的问题的动机:如果我使用只是delete ptr; if (ptr)在一个移动赋值操作符和某个类的析构函数中没有if (ptr) guard,那么std::swap与该类的对象产生3个与GCC的call指令。 这可能是一个相当大的性能损失,例如,sorting这样的对象数组时。 而且,我可以写if (ptr) delete ptr; 无处不在,但是,不知道这是否也不是一个性能损失,因为deleteexpression式也需要检查ptr 。 但是,在这里,我想,编译器只会生成一个单一的检查。 另外,我真的很喜欢没有防范的情况下调用delete的可能性,这对我来说是一个惊喜,它可能会产生不同的(性能)结果。 UPDATE 我只做了一个简单的基准testing,即sorting对象,在移动赋值运算符和析构函数中调用delete 。 来源在这里: https : //godbolt.org/g/7zGUvo 在至强E2680v3上使用GCC 7.1和-O2标志测量std::sort运行时间: 链接的代码中有一个错误,它比较指针,而不是指向值。 更正的结果如下: 没有防守: 17.6 [s] 40.8 [s] , […]

那么,std :: unique_ptr的定制删除器是如何工作的呢?

根据N3290, std::unique_ptr在其构造函数中接受一个deleter参数。 但是,我不能在Windows中使用Visual C ++ 10.0或MinGW g ++ 4.4.1,也不能使用Ubuntu中的g ++ 4.6.1。 因此,我担心自己对这个问题的理解是不完整或错误的,我看不到一个明显被忽略的删除论点,那么任何人都可以提供一个工作的例子吗? 最好我也想看看unique_ptr<Base> p = unique_ptr<Derived>( new Derived ) 。 可能用标准中的一些措辞来备份这个例子,也就是说,不pipe你使用的是什么编译器,它实际上是做它应该做的事情?

Visual Studio如何处理删除的指针,为什么?

我一直在阅读的一本C ++书籍指出,当使用delete操作符删除一个指针时,它所指向的位置上的内存被“释放”,并且可以被覆盖。 它还指出指针将继续指向相同的位置,直到它被重新分配或设置为NULL 。 但是在Visual Studio 2012中, 这似乎并不是这样! 例: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; } 当我编译和运行这个程序,我得到以下输出: ptr = 0050BC10 ptr = 00008123 Press any […]

函数声明后的= delete的含义

class my_class { … my_class(my_class const &) = delete; … }; 在这种情况下, = delete是什么意思? 还有没有其他的“修饰符”(除了= 0和= delete )?

为什么要replace默认的新的和删除操作符?

为什么要用一个自定义的new和delete操作符来replace默认的操作符new和delete ? 这是在重载 C ++ FAQ中重载和删除的延续: 运算符重载。 此常见问题解答的后续条目是: 我应该如何编写符合ISO C ++标准的自定义new和delete操作符? 注意:答案是基于Scott Meyers的“更有效的C ++”的教训。 (注意:这是一个Stack Overflow的C ++常见问题解答的入口,如果你想批评在这个表单中提供FAQ的想法,那么在这个开始所有这些的meta上的贴子将是这个地方的答案。那个问题在C ++聊天室中进行监控,常见问题解决scheme首先出现,所以你的答案很可能会被那些提出这个想法的人阅读)。

如何删除知道这是一个数组?

好的,我认为我们都同意下面的代码会发生什么变化,这取决于传递的内容, void deleteForMe(int* pointer) { delete[] pointer; } 指针可能是各种不同的东西,所以对其执行无条件的delete[]是未定义的。 不过,我们假设我们确实正在传递一个数组指针, int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 我的问题是,在这种情况下,指针是一个数组,谁知道这个? 我的意思是,从语言/编译器的angular度来看,它不知道arr是一个数组指针还是指向一个int的指针。 哎呀,它甚至不知道arr是否是dynamic创build的。 但是,如果我做了下面的事情, int main() { int* num = new int(1); deleteForMe(num); return 0; } 操作系统是足够聪明的,只删除一个整数,而不是去某种types的“杀死狂欢”删除超出该点的其余内存(对比,使用strlen和一个非\0终止的string – 它会保持直到击中0)。 那么谁的工作就是要记住这些东西? 操作系统在后台保存某种types的logging吗? (我的意思是,我意识到我是从这个post开始说发生的事情是不确定的,但事实是,“杀人狂”的情景不会发生,所以在实际的世界里有人记得)。

我应该如何编写符合ISO C ++标准的自定义新的和删除操作符?

我应该如何编写符合ISO C ++标准的自定义new和delete操作符? 这是在重载 C ++ FAQ, 运算符重载及其后续操作中重载new和delete的延续, 为什么要replace默认的new和delete运算符呢? 第一部分:编写符合标准的new操作符 第1部分:了解编写自定义new操作符的要求 第2部分:了解new_handler要求 第3部分:了解特定场景要求 第二部分:编写符合标准的delete操作符 实现自定义删除操作 (注意:这是一个Stack Overflow的C ++常见问题解答的入口,如果你想批评在这个表单中提供FAQ的想法,那么在这个开始所有这些的meta上的贴子将是这个地方的答案。那个问题在C ++聊天室中进行监控,常见问题解决scheme首先出现,所以你的答案很可能会被那些提出这个想法的人阅读)。 注意:答案是基于Scott Meyers的“更有效的C ++”和ISO C ++标准的学习。

在JavaScript中删除数组元素 – 删除与拼接

在数组元素上使用delete操作符与使用Array.splice方法相比有什么Array.splice ? 例如: myArray = ['a', 'b', 'c', 'd']; delete myArray[1]; // or myArray.splice (1, 1); 为什么即使有splice方法,如果我可以删除像我可以用对象数组元素?