标签: delete-operator

在C++中删除指针

背景:我试图围绕指针,我们几周前在学校看到它们,今天练习时我遇到了傻瓜?问题,对你来说可能非常简单,但我几乎没有编程经验.

我在SO中看到了很多关于删除指针的问题,但它们似乎都与删除一个类有关,而不是一个"简单"指针(或任何正确的术语),这里是我试图的代码跑:

#include <iostream>;

using namespace std;

int main() {
  int myVar,
      *myPointer;

  myVar = 8;
  myPointer = &myVar;

  cout << "delete-ing pointers " << endl;
  cout << "Memory address: " << myPointer << endl;

  // Seems I can't *just* delete it, as it triggers an error 
  delete myPointer;
  cout << "myPointer: " << myPointer << endl;
  // Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
  // pointer being freed was not allocated
  // *** set a breakpoint in malloc_error_break …
Run Code Online (Sandbox Code Playgroud)

c++ pointers delete-operator

80
推荐指数
4
解决办法
25万
查看次数

你如何在C++中'realloc'?

我怎么能用reallocC++?它似乎在语言中缺失 - 有new,delete但不是resize!

我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它.我不认为delete旧指针和new新的更大的指针是正确的选择.

c++ realloc new-operator delete-operator

78
推荐指数
3
解决办法
7万
查看次数

在c ++ 0x中删除nullptr仍然是安全的吗?

c++03它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2:

在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.

然而,在目前的草案对于c++0x这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x,如果是,在哪里?

笔记:

有大量的间接证据表明它仍然有明确的定义.

首先,有两句话§5.3.5/2说明

在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,...

在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或...

这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.

其次,改变意义delete 0是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变.此外,没有提到这是c++0x草案兼容性附件(附件C)的重大变化.但是,附件C是一个信息性部分,因此对标准没有任何解释.

另一方面,删除空指针要求无效的事实意味着额外的运行时检查.在很多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突.也许委员会刚刚决定改变行为,使标准c ++更符合语言的既定设计目标.

c++ null language-lawyer delete-operator

73
推荐指数
2
解决办法
4万
查看次数

为什么要替换默认的new和delete运算符?

为什么一个会替换默认的操作newdelete使用自定义newdelete运营商?

这是继续重载新的和删除在非常有启发性的C++ FAQ:
运算符重载.

本FAQ的后续条目是:
我应该如何编写符合ISO C++标准的自定义newdelete运算符?

注意:答案基于Scott Meyers的"更有效的C++"课程.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading c++-faq new-operator delete-operator

64
推荐指数
4
解决办法
2万
查看次数

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

我应该如何编写符合ISO C++标准的自定义newdelete运算符?

这是在延续重载new和delete在非常照明C++ FAQ,操作符重载,以及其后续,一个为什么要更换默认的new和delete操作?

第1部分:编写符合标准的new运算符

第2节:编写符合标准的delete运算符

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法首先开始,所以你的答案很可能被那些提出想法的人阅读.)
注意:答案是基于Scott Meyers的学习'更有效的C++和ISO C++标准.

c++ operator-overloading c++-faq new-operator delete-operator

62
推荐指数
4
解决办法
1万
查看次数

什么是 C++20 中的“销毁运算符删除”?

C ++ 20 引入了“销毁operator delete”:operator delete采用标记类型std::destroying_delete_t参数的新重载。

这到底是什么,什么时候有用?

c++ destructor destroy delete-operator c++20

57
推荐指数
1
解决办法
3835
查看次数

在堆栈上分配的变量上调用delete

忽略编程风格和设计,在堆栈上分配的变量上调用delete是"安全的"吗?

例如:

   int nAmount;
   delete &nAmount;
Run Code Online (Sandbox Code Playgroud)

要么

class sample
{
public:
    sample();
    ~sample() { delete &nAmount;}
    int nAmount;
}
Run Code Online (Sandbox Code Playgroud)

c++ heap stack delete-operator

56
推荐指数
6
解决办法
5万
查看次数

那么,std :: unique_ptr的自定义删除工作如何工作?

根据N3290 std::unique_ptr在其构造函数中接受一个删除参数.

但是,我不能在Windows中使用Visual C++ 10.0或MinGW g ++ 4.4.1,也不能在Ubuntu中使用g ++ 4.6.1.

因此,我担心我对它的理解是不完整或错误的,我不能看到显然被忽略的删除论证的观点,那么任何人都可以提供一个有效的例子吗?

我最好还想看看它是如何工作的unique_ptr<Base> p = unique_ptr<Derived>( new Derived ).

可能会使用标准中的一些措辞来备份示例,即使用您正在使用的任何编译器,它实际上做了它应该做的事情?

c++ unique-ptr delete-operator c++11

55
推荐指数
4
解决办法
4万
查看次数

在队列::推送后双重免费或损坏

#include <queue>
using namespace std;

class Test{
    int *myArray;

        public:
    Test(){
        myArray = new int[10];
    }

    ~Test(){
        delete[] myArray;
    }

};


int main(){
    queue<Test> q
    Test t;
    q.push(t);
}
Run Code Online (Sandbox Code Playgroud)

运行此操作后,我收到运行时错误"double free or corruption".如果我摆脱析构函数内容(delete),它工作正常.怎么了?

c++ runtime-error delete-operator

52
推荐指数
2
解决办法
10万
查看次数

在删除之前有没有理由检查NULL指针?

我经常NULL在删除指针之前看到遗留代码检查,类似于

if (NULL != pSomeObject) 
{
    delete pSomeObject;
    pSomeObject = NULL;
}
Run Code Online (Sandbox Code Playgroud)

NULL在删除之前有没有理由检查指针?NULL之后设置指针的原因是什么?

c++ null pointers delete-operator

49
推荐指数
4
解决办法
3万
查看次数