C++ 为什么我们必须在C++;而不仅仅是整个;“矩阵”;

C++ 为什么我们必须在C++;而不仅仅是整个;“矩阵”;,c++,memory-management,C++,Memory Management,如果我们有 n=3; m=3; A=新整数[n]; 对于(int i=0;i如果delete一个数组,数组的每个元素都会调用它的析构函数。问题是指针没有析构函数,你需要显式删除它。如果delete一个数组,数组的每个元素都会调用它的析构函数。问题是指针没有如果没有析构函数,您需要明确地删除它。如何确保a知道它需要释放a[0],a[1],a[2]所指的内容 例如,如果我写了一个程序,比如: auto A = new int* [3]; int i0; int i1; int i2; A[0] =

如果我们有

n=3;
m=3;
A=新整数[n];

对于(int i=0;i如果
delete
一个数组,数组的每个元素都会调用它的析构函数。问题是指针没有析构函数,你需要显式
删除它。

如果
delete
一个数组,数组的每个元素都会调用它的析构函数。问题是指针没有如果没有析构函数,您需要明确地删除它。

如何确保
a
知道它需要释放
a[0]
a[1]
a[2]
所指的内容

例如,如果我写了一个程序,比如:

auto A = new int* [3];
int i0;
int i1;
int i2;
A[0] = &i0;
A[1] = &i1;
A[2] = &i2;
那么,
delete[]a
尝试进一步操作将是一个错误

在低级别的直接内存分配(也称为直接新建/删除使用)中,由开发人员确定哪些是正确的


P>另一方面,C++提供了更高级的特征,使事情变得更容易。例如,能够用适当的清理器和类的东西来包装事物,以及诸如“代码> STD::数组< /COD>”、“代码> STD::向量< /代码>、<代码> STD::UNQuijyPTR 等等。确保子对象/子分配得到适当管理。

如何确保
A
知道它需要取消分配
A[0]
A[1]
A[2]
所指的内容

例如,如果我写了一个程序,比如:

auto A = new int* [3];
int i0;
int i1;
int i2;
A[0] = &i0;
A[1] = &i1;
A[2] = &i2;
那么,
delete[]a
尝试进一步操作将是一个错误

在低级别的直接内存分配(也称为直接新建/删除使用)中,由开发人员确定哪些是正确的


P>另一方面,C++提供了更高级的特征,使事情变得更容易。例如,能够用适当的清理器和类的东西来包装事物,以及诸如“代码> STD::数组< /COD>”、“代码> STD::向量< /代码>、<代码> STD::UNQuijyPTR 等等。在适当的C++中,使用<代码> > STD::数组< /COD>和/或<代码> STD::向量 >在现代C++中,而不是C样式数组和手动内存管理(显式<代码>新< /代码> /<代码>删除>代码>)。C++ 98中的好代码通常不再是C++ 17(以后)的好代码。事情已经发展了,我们现在有更好的选择。考虑将矩阵封装在一个类中,并且在该类中的实现是一个平面向量。该类从维度坐标转换成平面向量,例如<代码>双和AT(int x,int y){aScript(x>=0 & & x柱大小);(Y>=0 & &考虑使用C++ <代码>:/>或<代码> STD::矢量C++/代码在现代C++中,而不是C样式数组和手动内存管理(显式<代码>新< /代码> /<代码>删除>代码>)。C++ 98中的好代码通常不再是C++ 17(稍后)的好代码。事情已经发展了,我们现在有更好的选择。考虑将矩阵封装在一个类中,并且在该类中的实现是一个平面向量。该类从维度坐标转换成平面向量,例如<代码>双和AT(int x,int y){aScript(x>=0 & & x柱大小);断言(y>=0 & y)。