在对象数组C 上使用新的和删除

Using new and delete on object arrays C++

本文关键字:删除 对象 数组      更新时间:2023-10-16

删除呼叫击路仪吗?我已经在第一个答案中修改了代码,但我无法觉得我错了。它正在使用0个错误进行编译,但是当我运行该错误时,程序崩溃了,DEVC 调试模式也给了我sigtrap信号。我真的很欣赏第二手。

所以这个想法是;改革()将删除旧数组(如有必要,第二个参数是可选的,我只是在构造函数中使用它,因为当时指针实际上为null(?))。然后,它将使用输入参数大小再次将其分配给新。我真的不知道哪一部分可能是错误的。感谢所有答案。

#include <iostream>
using namespace std;
class A
{
    private:
        int val;
    public:
        A();
        int GetVal();
        void SetVal(int Val);
};
A::A()
{
    this->val = 0;
}
int A::GetVal()
{
    return this->val;
}
void A::SetVal(int Val)
{
    this->val = Val;
}

#define DEF_A_SIZE 1
class B
{
    private:
        A *a_s;
        int aSize;
        int aCount;
        void reform(const int size, int dlt = 1);
public:
    B();
    ~B();
    void SetSize(const int newSize);
    int GetSize();
    void AddA(A a);
    A GetA(int index);
};
void B::reform(const int size, int dlt)
{
    if(dlt)
    {
        delete[] (this->a_s);
    }
    this->a_s = new A[size];
    this->aCount = 0;
    this->aSize = size;
}
B::B()
{
    reform(DEF_A_SIZE, 0);
}
B::~B()
{
    delete [] (this->a_s);
}
void B::SetSize(const int newSize)
{
    reform(newSize);
}
int B::GetSize()
{
    return this->aSize;
}
void B::AddA(A a)
{
    if (aCount < aSize)
    {
        this->a_s[aCount].SetVal(a.GetVal());
        aCount++;
    }
}
A B::GetA(int index)
{
    if (index < aCount)
    {
        return this->a_s[index];
    }
}
#define B_NUM 1
class C
{
    private:
        B *b_s;
        int bc;
        int bs;
        void reform(const int size, int dlt = 1);
    public:
        C();
        ~C();
        void addb(B b);
        B getB(int index);
};
void C::reform(const int size, int dlt)
{
    if (dlt)
    {
        delete [] (this->b_s);
    }
    bc = 0;
    bs = size;
    b_s = new B[size];
}
void C::addb(B b)
{
    if (bc < bs)
    {
        b_s[bc].SetSize(b.GetSize());
        for (int i = 0; i < b.GetSize(); i++)
        {
            b_s[bc].AddA(b.GetA(i));
        }
        bc++;
    }
}
B C::getB(int index)
{
    if (index < bc)
    {
        return b_s[index];
    }
}
C::C()
{
    reform(B_NUM, 0);
}
C::~C()
{
    delete [] (this->b_s);
}
int main()
{
    C *cptr = new C();
    B b = B();
    b.SetSize(2);
    A a = A();
    a.SetVal(10);
    b.AddA(a);
    A a2 = A();
    a2.SetVal(20);
    b.AddA(a2);
    cptr->addb(b);
    cout << cptr->getB(0).GetA(0).GetVal() << endl;
    cout << cptr->getB(0).GetA(1).GetVal() << endl;
    delete cptr;
    cin.get();
    return 0;
}

解决

事实证明,我的问题是我的添加或获得功能。我以这种方式改变了他们;Getters将返回对相应对象的引用(例如B&amp; getB(int index););)Adder的指针将作为参数,而不是对象(或值)(例如void addb(b *b);)

"删除会调用击曲线吗?"

是的,deletedelete[]调用受影响的类实例的破坏性函数。