在对象数组C 上使用新的和删除
Using new and delete on object arrays C++
删除呼叫击路仪吗?我已经在第一个答案中修改了代码,但我无法觉得我错了。它正在使用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);)
"删除会调用击曲线吗?"
是的,delete
或delete[]
调用受影响的类实例的破坏性函数。
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象