相关疑难解决方法(0)

一个对象可以释放它的记忆吗?

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

我正在通过阅读非常好的C++ Primer来学习C++,并且我正在学习C++如何通过delete像C这样的关键字释放内存free.Java和Pascal没有这种用于释放内存的机制.如果程序运行很长时间并且变量被破坏,那么它可能会导致程序错误,因此不应该忽略它.

简而言之,我想知道它是合法的还是可以推荐的,例如在C++中变量可以做this.delete()和删除自己.我们大多听说过在C和C++中释放指针,这是用新的freedelete关键字完成的.Pascal也有指针,但Java没有.所以在Java中它不应该是可能的,因为你没有明确删除对象,C没有对象,因此一个struct不能free为它分配即使因为C没有对象也不是技术上是可行的内存确实帕斯卡.

因此,我认为离开C++是为了我的问题,对象是否合法删除自己的类似的东西this.delete()

c++ delete-operator

5
推荐指数
2
解决办法
1592
查看次数

在成员函数返回之前删除对象是不确定的行为?

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

我正在尝试创建一个管理游戏状态的系统.

我当前设计的问题是,当我切换状态时,在控制切换到新状态之前删除旧状态.

以下是我的代码的简化版本:

class StateManager;

class State
{
public:
    virtual void update(StateManager &manager)= 0;
    virtual ~State(){}
};


class StateManager
{
public:
    void setState(std::unique_ptr<State> && newState )
    {
        currentState = std::move(newState);
    }
    std::unique_ptr<State> currentState;

    void run()
    {
        currentState->update(*this);
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,如果State对象在update方法中调用StateManager :: setState,则会有一段时间在刚刚销毁的对象上调用成员函数.

有关此行为的完整示例,请访问http://ideone.com/WHLzJL.注意在FirstState :: update返回之前如何调用FirstState的析构函数.

这是C++中未定义的行为吗?如果是这样,我应该如何改变我的设计?

c++

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

删除这个?它有什么作用?

鉴于以下内容:

#include <iostream>
using namespace std;

class A
{
public:
    void func() {delete this;}
    A() : x(5) {cout << "ctor A" << endl;}
    ~A() {cout << "dtor A" << endl;}
    int x;
};

int main() {
    A a;
    cout << "The X value: " << a.x << endl;
    a.func();  // calling 'delete this' ->going to the dtor #1
    cout << "The X value: " << a.x << endl;
    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

输出是:

ctor A
The X value: 5
dtor A …
Run Code Online (Sandbox Code Playgroud)

c++ destructor self-destruction delete-operator

2
推荐指数
1
解决办法
785
查看次数

我可以告诉一个对象删除我吗?

一个对象a类的A调用对象b的类的B,通过指针:

void A::fun(){
  bPtr->delete_me();
}
Run Code Online (Sandbox Code Playgroud)

在被调用函数中,我们通过一个指针(之前存储了该指针)删除了调用对象:

void B::delete_me(){
  delete aPtr;
}
Run Code Online (Sandbox Code Playgroud)

这是安全的,因为A调用后访问任何成员bPtr->delete_me();

c++ delete-operator

2
推荐指数
1
解决办法
71
查看次数

C++ 中 `delete this` 和 `this-&gt;~Obj` 之间的区别

当我编写一个演示字符串类时,在复制赋值函数中,我尝试在复制之前通过“删除此”来清除自身。但它失败了。

    Str &operator=(const Str &s) {
        if (this != &s) {  // self-assignment check
            //delete this; //cannot run as I imagine
            this->~Str();  
            _size = s._size;
            _str = new char[_size + 1];
            memcpy(_str, s._str, _size + 1);
        }
        return *this;
    }
    ~Str() {
        _size = 0;
        delete[] _str;
    }
Run Code Online (Sandbox Code Playgroud)

linux 告诉我的

双释放或损坏(出)中止(核心转储)

c++ memory-management double-free assignment-operator delete-operator

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

从对象调用的方法可以删除该对象吗?

我有点困惑试图理解这里发生的事情。如果一个类对象调用一个方法,然后该方法随后销毁该对象,那么该方法不应该返回,并且应该立即销毁该对象并立即调用析构函数。对吗?但相反,代码只是崩溃了。那么,是否不允许对象调用删除自身的方法?我假设从调用堆栈的工作原理来看,指向对象的指针将被销毁,因此当函数返回到调用者时,在进一步调用调用堆栈时指针不再有效?

class Foo
{
public:
    virtual void Run()
    {
        printf("Entering callback\n");
        RunSomeCallback();
        printf("We're back from callback\n");
    }
    virtual void RunSomeCallback() = 0;
    
    virtual ~Foo()
    {
        printf("We're Destroyed\n");
    }
};

Foo* f = nullptr;

void DestroyFoo();

class Bar : public Foo
{
public:
    virtual void RunSomeCallback()
    {
        printf("Inside callback\n");
        DestroyFoo();
    }
};


void DestroyFoo()
{
    printf("Deleting foo\n");
    delete f;
}
int main()
{
    f = new Bar();
    f->Run();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,当我使用shared_ptr运行代码时,行为似乎发生了变化,但在这种情况下,析构函数在打印“我们从回调中返回”之前被调用,代码运行,但这是否是未定义的行为?

class Foo
{
public:
    virtual void Run()
    {
        printf("Entering …
Run Code Online (Sandbox Code Playgroud)

c++

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

删除此指针时堆栈溢出

我有以下代码,我得到堆栈溢出错误任何人都可以请解释我这里有什么问题.从我的理解,这个指针指向当前对象,所以为什么我不能在析构函数中删除它;

class Object 
{
private:
    static int objCount;
public:
    int getCount()
    {
        int i =10;
        return i++;
    }
    Object()
    {
        cout<< "Obj Created = "<<++objCount<<endl;
        cout <<endl<<this->getCount()<<endl;
    }
    ~Object()
    {
        cout<<"Destructor Called\n"<<"Deleted Obj="<<objCount--<<endl;
        delete this;
    }
};

int Object::objCount = 0;

int _tmain(int argc, _TCHAR* argv[])
{


    {
        Object obj1;
    }

    {

              Object *obj2 = new Object();
    }
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stack

0
推荐指数
1
解决办法
204
查看次数