2014-04-20 1 views
1

시도해 보았지만 코드에서 실수를 찾아 냈지만 여전히 찾을 수 없습니다. 스택 클래스의 앨범이 있는데, 크기를 조정하고 싶다고 생각합니다. 하지만 어떤 이유 때문에 대부분의 경우 프로그램이 충돌하고 10 개 중 하나가 정상적으로 작동하고 이유가 전혀 없습니다. 실수를 지적하면 큰 문제가 될 수 있습니다. 그래서 여기에 코드입니다 :스택 크기 조정을 위해 메모리를 할당 할 때 문제가 발생했습니다.


const Song Song::null_song;//static from Song class 

class Album 
{ 
    Song* songs; 
    char* name; 
    int top; 
    int capacity; 
    bool full() const; 
    void resize(); 

public: 
    ... 
} 

그리고 여기에 내가 다음 앨범에서 미리 정의 된 INIT_CAPACITY 더 많은 항목을 밀어하려고 할 때 어딘가에에서 culprit.The 문제가 발생되고, 기능되는 = 4 문제가 새로운 메모리를 할당해야합니다.

귀하의 Song도 사용 char*std::string를 사용한다
const int INIT_CAPACITY=4; 

std::ostream& operator<<(std::ostream& os, Album& p) 
{ 
    os<<"Name of Album:"<<p.name<<std::endl; 
    for(int i=0;i<=p.top;i++) 
     os<<p.songs[i]<<std::endl; 
} 

Album::Album(const char* p) 
{ 
    int len1=strlen(p); 
    name=new char [len1+1]; 
    strcpy(name,p); 
    top=-1; 
    songs = new Song[INIT_CAPACITY]; 
    capacity = INIT_CAPACITY; 
} 

Song Album::pop() 
{ 
    if (empty()) 
     return Song::null_song; 
    return songs[top--]; 
} 

Song Album::last() const 
{ 
    if (empty()) 
     return Song::null_song; 
    return songs[top]; 
} 

bool Album::push(Song x) 
{ 
    if (full()) 
     resize(); 
    songs[++top] = x; 
    return true; 
} 

void Album::resize() 
{ 
    capacity *= 2; 
    Song* newsongs = new Song[capacity]; 
    for(int i = 0; i < capacity/2; i++) 
     newsongs[i] = songs[i]; 
    delete[] songs; 
    songs = newsongs; 
} 

bool Album::empty() const 
{ 
    return top == -1; 
} 

bool Album::full() const 
{ 
    return top == capacity-1; 
} 

Album::Album() 
{ 
    top=-1; 
    songs = new Song[INIT_CAPACITY]; 
    capacity = INIT_CAPACITY; 

    name=new char [1]; 
    name[0]='\0'; 
} 

Album::~Album() 
{ 
    delete [] songs; 
    delete [] name; 
} 
+3

안녕하세요. 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소 테스트 케이스] (http://stackoverflow.com/help/mcve)를 구성해야합니다.) –

+2

std :: string과 std :: vector를 사용하고 new를 사용하지 않고 delete 문제는 사라질 것입니다. – paulm

+0

@OliCharlesworth 잘 보았습니다. 그러나 당신이 볼 수 있듯이 나는 여전히 프로그래밍에 능숙하지 못했습니다. 내가 작성한대로 INIT_CAPACITY에서 소리내어 읽는 것보다 많은 항목을 가지고 자 할 때 문제가 나타납니다. 문제는 내가 논리에서 문제가 있다고 생각하는데, 이것은 찾기가 더 어렵습니다. – user3144334

답변

1

.

소멸자에서이 포인터를 삭제하지만 할당 연산자 또는 복사 생성자를 정의하지 않았습니다.

Album의 크기를 조정하면 Song에 모두 잘못된 포인터가 포함됩니다.

+0

에 몇 가지 검사를 추가해야한다고 생각합니다. mean char * name, 그것은 앨범의 이름이고 Song에 대한 포인터에 어떤 영향을 미치는지 모릅니다. Btw Song은 char * title과 char * author로 구성되어 있습니다. 문자열로 변경한다고 생각하면 시도해 볼 수는 있지만 도움이되지는 않을 것이라고 생각합니다. – user3144334

+0

@ user3144334'송 (Song) '을 썼기 때문에'송 (Song)'이라고 썼는데,'제목'과'작가'포인터는 정확히 내가 의심했던 것입니다. – molbdnilo

+0

음, 모든 char *을 string으로 변경했는데 이제는 충돌하지 않습니다. 하지만 여전히 내가 위의 INIT_CAPACITY 이동 후 인쇄되지 않습니다 : ( – user3144334

관련 문제