0

Any Primitive Data Type を使用するが、ADT では機能しない場合は機能します。すべてのコピー コンストラクター ">>" "<<" "=" 演算子がオーバーロードされ、コピー コンストラクターも記述されていますが、以下のすべてのコードを確認できます。よろしくお願いします

void main(){

    Array <Item> c;//It will work if we use Any Permitive Data Type but not Working for ADT Even though all copy constructor / >> << operators are overloaded

Item obj(334,"Mango Juice",90,"Drinks",10);

c.insertAtStart(obj);
c.insertAtStart(obj);/////The program Crashes Here!!
c.insertAtStart(obj);


c.PrintArray();
cout<<endl;`


////while Array.h is given below
`
#ifndef H_ARRAY
#define H_ARRAY

#include<iostream>
using namespace std;

template<class T>
class Array
{
private:
    T *a;
    int size;               // total size
    int length_used;        // used size
public:

    Array():a(NULL),size(0),length_used(0){}

    void insertAtStart( T val){

    if(isEmpty()){
        a=new T();
    a[0]=val;

    length_used++;
    size++;
    cout<<"Pehli condition"<<endl;
    }

    else{ 

        if(size>length_used){
            shiftRight();
        a[0]=val;
        length_used++;
            cout<<"jab size bara ho length_used"<<endl; 
        }
        else if(size==length_used){

        cout<<"jab size or length_used braber ho jao 3rd condiot"<<endl;    
        resizeByOne();

        shiftRight();
        a[0]=val;
        length_used++;

        }

    }
}




void insertAtEnd( T val){

    if(isEmpty()){
        a=new T;
    a[0]=val;

    length_used++;
    size++;
    }

    else{ 

        if(size>length_used){
            a[length_used+1]=val;
        length_used++;

        }
        else if(size==length_used){
        resizeByOne();
        a[length_used]=val;
        length_used++;
        }

    }
}





void deleteFromStart(){

    if(isEmpty()){
        cout<<"Container is Empty"<<endl;
    }

    else{ 

        a[0]=='\0';

        shiftLeft();
        size--;
        length_used--;

    }
}



void deleteFromEnd(){

    if(isEmpty()){
        cout<<"Container is Empty"<<endl;
    }

    else{ 

        a[length_used]='\0';

        length_used--;
        size--;


    }
}


void PrintArray(){

    for(int i=0;i<size;i++)
        cout<<a[i]<<endl;


}












////////////////////Helper functions///////////////////////

    bool isEmpty(){
    if(a=='\0')
        return 1;
    return 0;
    }


void    shiftRight(){

    int tempIterator=size;
    for(int i=tempIterator-1;i>=0;i--)
        a[i]=a[i-1];
    }


void    shiftLeft(){

    int tempIterator=length_used;
    for(int i=0;i<size;i++)

        a[i]=a[i+1];
    a[0]=NULL;


}




void    resizeByOne(){

        T *temp=new T[size+1];

        for(int i=0;i<length_used;i++)
            temp[i]=a[i];

        a=NULL;
        delete []a;
        a=temp;
        size++;
    }

};

#endif`
4

1 に答える 1

1
void shiftRight()
{

    int tempIterator=size;
    for(int i=tempIterator-1;i>=0;i--)
    a[i]=a[i-1];
}

a[0] = a[-1]最後の反復は、アクセス違反を引き起こす可能性があるものにつながりi>0ます。終了条件として試してください。この場合のアクセス違反はかなり厄介です。のメモリにa[-1]アクセスできる場合 (たとえば、いくつかのデータがそこに割り当てられている場合)、例外/クラッシュは発生しません。例外は非決定的な方法で発生します。

ところで

a=NULL;
delete []a;

resizeByOne()メソッドで。例外は発生しませんが (削除は安全です)、確実にメモリ リークが発生します。

于 2013-06-19T13:11:39.763 に答える