0

我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用new/deletemalloc/获得相同的效果free。除了不使用构造函数初始化列表之外,还有哪些其他约束?您是否认为以下代码以正确的方式模拟了新建/删除行为?

#include <iostream>
using namespace std;

class X
{
private:
        int* a;
public:
        X(int x)
        {
             this->a = new int;
             *(this->a) = x;
        }
        ~X() { delete this->a; }
        int getA() { return *(this->a); }
};

class Y
{
private:
        int* a;
public:
        void CTor(int x)
        {
             this->a = new int;
             *(this->a) = x;
        }
        void DTor() { delete this->a; }
        int getA(){ return *(this->a); }
};

void main()
{
     X *xP = new X(44);
     cout<<xP->getA()<<endl;
     delete xP;

     Y *yP = static_cast<Y*>(malloc(sizeof(Y)));
     yP->CTor(44);
     cout<<yP->getA()<<endl;
     yP->DTor();
     free(yP);

     system("pause");
}

如果不使用delete xP,程序结束时会自动调用析构函数,但不会释放空闲存储区(即释放 的xP空闲存储区,字段的空闲存储区a)。当使用delete xP析构函数被调用,然后一个自由存储被完全释放。如果我错了,请纠正我。

4

2 回答 2

1

有许多细微的区别可以new区分mallocdeletefree我相信只有当类是 POD 类型时它们才是等价的。

我应该警告你永远不能随意混合这两种类型。Anew必须始终由 a 平衡,delete而不是由 a平衡free。同样malloc必须由 平衡free。将两者混合会导致未定义的行为。

于 2013-10-21T21:36:26.557 回答
1

您的问题的实际答案是您不正确,不调用delete xP会导致内存泄漏。操作系统很可能会为您清理内存,但 C++ 运行时库并不保证会发生这种情况 - 这是操作系统通常提供的一项很好的服务 [而且它也非常方便,因为它允许我们编写不完美的代码,并拥有这样的代码,if (condition) { cout << "Oh horror, condition is true, I can't continue" << endl; exit(2); }当我们遇到可怕的错误时,不必担心清理所有内容]。

然而,我的主要观点是,一旦您添加本身需要销毁的成员,这种东西就会变得非常混乱,例如

class X
{
  private:
    std::string str;
  ... 
};

没有简单的方法可以调用str. 如果您决定使用异常和自动清理,情况会变得更糟。

于 2013-10-21T21:39:53.810 回答