C++动态分配

Rad*_*adu -2 c++ arrays dynamic

我对以下说明非常困惑:

#include <iostream>
#define MAX_IT 100
using namespace std;

class Integer{

private :
    int a;
public:
    Integer(int valoare){a=valoare;}
    int getA(){return a;}
    void setA(int valoare){a=valoare;}
};

int main(){
    Integer* a=new Integer(0);

    //cout<<a[0].getA();
    for(int i=1;i<=MAX_IT;i++)
    {
        a[i]=*(new Integer(i));
    }

    for(int i=0;i<=MAX_IT;i++)
        cout<<a[i].getA()<<endl;

    return 13;
}
Run Code Online (Sandbox Code Playgroud)

它适用于MAX_IT的小值,但是当我尝试将MAX_IT设置为1000时,它不再起作用.最初,我认为"新"操作员应该完成这项工作,但经过一些阅读文档后,我明白它不应该像这样(超出数组)工作.

所以我的问题是:为什么它适用于MAX_IT的小值而不适用于较大的值?

编辑:

我正在尝试使用此代码来处理更大的程序,我不允许使用STL.你还没有理解我的顾虑:如果我有Integer*var = new Integer [10]; for(int k = 1; K <10; k ++)*(var + k)= k; //这很好,但如果我尝试var [10] = new Integer; //这应该不起作用,应该会产生内存问题//我担心的是,如果我只做了100次左右它就能正常工作......这个问题为什么每次迭代次数都很少?

小智 17

因为通过为一个 空间分配空间Integer然后将其用作多个Integers数组,您的代码会调用未定义的行为,这意味着它可以执行任何操作,包括崩溃,工作看起来很好,或者从您的鼻子中拉出恶魔.


无论如何,它正在泄漏记忆.如果您不需要动态内存分配,则不要使用它.

a[i]=*(new Integer(i));
Run Code Online (Sandbox Code Playgroud)

和kaboom,你失去了指向它的指针Integer,以后没有机会delete.泄漏.


如果您不需要原始数组,请不要使用它们.喜欢std::vector.如果C++太难,请切换到C.

std::vector<Integer> vec;
vec.push_back(Integer(1337));
Run Code Online (Sandbox Code Playgroud)

  • @Radu不允许**家庭作业或愚蠢的老板或嵌入式平台? (2认同)