相关疑难解决方法(0)

是否可以防止对象的堆栈分配,并且只允许使用"new"实例化它?

是否有可能阻止对象的堆栈分配,并且只允许在堆上使用"new"进行隔离?

c++ c++-faq

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

"删除这个"是否安全?

在我最初的基本测试中,这样做是完全安全的.然而,它已经让我吃惊试图操纵this该功能后delete小号this可能是一个运行时错误.这是真的,通常是安全的delete this吗?或者只有某些安全的情况?

c++ runtime-error self-destruction

33
推荐指数
5
解决办法
3万
查看次数

自我删除C++中的对象

可能重复:
C++:删除这个?
面向对象的自杀或删除此;

我想知道下面的代码是否安全运行:

#include <iostream>
using namespace std;

class A
{
public:
    A() {
        cout << "Constructor" << endl;
    }
    ~A() {
        cout << "Destructor" << endl;
    }

    void deleteMe() {
        delete this;
        cout << "I was deleted" << endl;
    }
};

int main()
{
    A *a = new A();
    a->deleteMe();
    cout << "Exit ...";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Constructor
Destructor
I was deleted
Exit ...
Run Code Online (Sandbox Code Playgroud)

并且程序正常退出,但这里有一些内存访问暴力吗?

c++

12
推荐指数
1
解决办法
9965
查看次数

删除类中的自我对象

可能重复:
C++:删除这个?

在C++中,可以删除函数定义中的自身对象.这有什么副作用?

class MyClass {

public:
    void ~myClass() {}
    void myFunction() { 
        // logic here
        delete this;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++

11
推荐指数
2
解决办法
3万
查看次数

删除自身内的std :: function对象

这是明确定义的行为吗?

#include <functional>

void foo() {
    auto f = new std::function<void()>;
    *f = [f]() { delete f; };
    (*f)();
    f = nullptr;
}

int main() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

使用最新的g ++,如果我在模板中执行此操作,它会在valgrind下运行时导致无效读取,否则它可以正常工作.为什么?这是g ++中的错误吗?

#include <functional>

template<std::size_t>
void foo() {
    auto f = new std::function<void()>;
    *f = [f]() { delete f; };
    (*f)();
    f = nullptr;
}

int main() {
    foo<0>();
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11 std-function

11
推荐指数
1
解决办法
2874
查看次数

对象是否可以从标准C++容器中清除自身?

以下代码

#include <iostream>
#include <map>

struct foo
{
  void kill(std::map<int, foo>& m, int i)
  {
    m.erase(i);
  }
};

int main()
{
  std::map<int, foo> m;

  m.emplace(1, foo() );

  std::cout << m.size() << std::endl;

  m[1].kill(m, 1);

  std::cout << m.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在没有警告的情况下编译(g ++),执行时没有错误,并且通过输出判断kill方法foo从地图中删除对象.但是,我觉得这可能实际上是未定义的行为.似乎kill在行之后的行m.erase(i) this不再指向有效对象.

C++标准对此有何看法?

c++ containers undefined-behavior

11
推荐指数
1
解决办法
269
查看次数

std::unique_ptr reset() 操作顺序

呼唤void reset( pointer ptr = pointer() ) noexcept; 会调用以下操作

\n
\n

给定 current_ptr(由 *this 管理的指针),按以下顺序执行以下操作:

\n
    \n
  1. 保存当前指针的副本 old_ptr = current_ptr
  2. \n
  3. 使用参数 current_ptr = ptr 覆盖当前指针
  4. \n
  5. 如果旧指针非空,则删除先前管理的对象 if(old_ptr) get_deleter()(old_ptr)。
  6. \n
\n
\n

参考参数

\n

这个特殊命令的原因是什么?为什么不先执行 3),然后再执行 2)?在这个问题中std::unique_ptr::reset 检查托管指针无效?第一个答案引用了标准

\n
\n

[\xe2\x80\xa6] [ 注意:这些操作的顺序很重要,因为调用 get_deleter() 可能会破坏 *this。\xe2\x80\x94结束注]

\n
\n

这是唯一的原因吗?怎么能get_deleter()毁掉unique_ptr*this )呢?

\n

c++ unique-ptr

10
推荐指数
1
解决办法
1888
查看次数

在虚拟成员函数中`删除这个'是安全的吗?

我已经知道某些形式的"自杀"是安全的(被认为是合法的),但是,delete this在虚拟成员函数中执行是否特别安全?

注意,"安全",我的意思是编译器生成的"代码"是否能够处理构造.

注意,我对这样做的利弊并不感兴趣,只是我能考虑是否安全.

附带问题:语言标准是明确地还是隐含地要求实现支持任何形式的delete this习语?

我不认为这是重复的是删除这个允许吗?.我的问题是关于在虚拟成员函数中是否安全.

以下是我要追求的内容概述

class FooBase {
protected:
    virtual void on_idle() { /* no-op by default */ }
};

class Foo : public FooBase {
    void on_idle() override final
    {
        delete this;
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,虽然Foo需要堆分配,但其他子类可能不会.

c++ memory-management

9
推荐指数
1
解决办法
275
查看次数

我可以从类方法中调用析构函数吗?

我有一个类似下面的Thread类

class Thread {
public:
  Thread();
  ~Thread();
  void start();
  void stop();
}
Run Code Online (Sandbox Code Playgroud)

所以我需要从stop()方法调用析构函数,这是一个很好的方法吗?

c++ destructor

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

如何通过析构函数方法删除对象(类)

我想知道是否可以通过析构函数方法删除对象?

我班级的构造函数和析构函数:

class cal
{
    public:
        cal()
        {
            days = 0;
            day = 1;
            month = 1;
            year = 1300;
            leap = true;
        };
        ~cal()
        {
            delete this;
        }
}*calendar = new cal;
Run Code Online (Sandbox Code Playgroud)

如何通过类删除此指针?

PS

我忘了写下面的代码

cal *calandar = new cal[];
Run Code Online (Sandbox Code Playgroud)

我想在堆中使用它而不是堆栈

我想经常使用这个类(对象)(很多那个对象)想象我应该写多少时间删除它,这使我难以理解,排除故障和跟踪代码我希望它们被自动销毁(在堆中)

当我执行"删除[]日历"时,我在我的班级中使用了以下代码,它减少了我的rams占用(使用的ram数量)它是否通过退出程序正常工作(销毁所有对象)?因为我使用GNU/Linus并且它使用或不使用那些行来破坏所有对象,我担心在windows中泄漏

void DisposeObject() { delete this; }
Run Code Online (Sandbox Code Playgroud)

c++ destructor class

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