首页 > 解决方案 > c++类动态分配自身实例

问题描述

所以我试图弄清楚如何创建一个可以动态分配和销毁自身的适当的 C++ 类。我想出了以下

class tClass {
public:
    tClass() {

        c = 0;
        extra = new int[1024 * 1024]; // To see memory usage

        while (true) {

            if (c != 1) {
                std::cout << "Name the class: ";
                std::cin >> str;
            }

            std::cout << "1 = create a new instance, 2 = delete this instance\n";
            std::cin >> c;

            if (c == 1) {
                tclass = new tClass();
            }
            else {
                break;
            }

        }

        delete[] extra;
        this->~tClass();

    }

    ~tClass() {
        std::cout << "tClass " << str << " destroyed\n" << std::endl;
    }

private:
    std::string str;
    tClass* tclass;
    int c;
    int* extra;
};

int main () {
    tClass *tclass = new tClass();
    delete tclass;
    return 0;
}

它有效,但我确信它不会以健康的方式运作。它真的释放了它使用的所有内存吗?将“delete[] extra”放入析构函数最终会给我内存访问冲突错误。

标签: c++classmemory

解决方案


我自己想通了。感谢mr5给我提示。

class Slave {
public:
    Slave(const std::string& str): _str(str) {
        std::cout << "Slave " << _str << " was created\n";
    }

    ~Slave() {
        std::cout << "Slave " << _str << " was destroyed\n";
    }

private:
    std::string _str;
};

class Master {
public:
    Master() { 
        while (true) {
            std::cout << "1 = create new, 2 = delete latest\n";
            std::cin >> c;

            if (c == 1)
                Create();
            else
                if (!Destroy())
                    break;
        }
    }

    ~Master() {}

    void Create() {
        std::cout << "Name the new class: ";
        std::cin >> str;
        slaves.push_back(new Slave(str));
    }

    bool Destroy() {
        if (slaves.size() > 0) {
            delete slaves[slaves.size() - 1];
            slaves.pop_back();
            return true;
        } else
            return false;
    }

private:
    std::string str;
    std::vector<Slave*> slaves;
    int c;
};

int main()
{
    Master* master = new Master();
    delete master;
    return 0;
}

推荐阅读