【问题标题】:Issue in allocating memory for resizing stack分配内存以调整堆栈大小的问题
【发布时间】:2014-06-04 21:52:56
【问题描述】:

我已经尝试并试图找出我的代码中的错误,但我仍然找不到它。我有一个 Stack 类专辑,我想调整它的大小,并认为我做对了。出于某种原因,但大多数程序崩溃的次数,也许十分之一的工作正常,我不知道为什么。如果你能指出错误,那就太好了。所以这里是代码:


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=4 时,就会出现问题。我认为它应该可以工作,但它没有,所以问题出在必须分配新的内存。


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;
}

【问题讨论】:

  • 嗨。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,你就发现了你的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
  • 使用 std::string 和 std::vector,停止使用 new 和 delete,你的问题就会消失
  • @OliCharlesworth 我试过了,但正如你所见,我在编程方面还没有变得很好。正如我写的那样,当我尝试拥有比 INIT_CAPACITY 中大声的项目更多的项目时,就会出现问题。问题是我认为我的逻辑有问题,很难找到。
  • 如果您认为Song 的类实现不相关,请三思;它是。例如:new Song[INIT_CAPACITY] 将触发 Song 的默认构造函数,恰好是 INIT_CAPACITY 次。 in 与构造函数相关的是什么。执行newsongs[i] = songs[i] 的循环会触发Song 的赋值运算符。该赋值运算符是相关的。 delete [] songs; 触发 N 个析构函数。 that 中的内容是相关的。将(Song song) 作为值参数传递会触发Song 复制构造函数。等等...见Rule of Three
  • 我认为你应该对'top'的值进行一些检查

标签: c++ oop memory-management constructor stack


【解决方案1】:

您的Song 也使用char*,它应该使用std::string

它在析构函数中删除了这个指针,但你还没有定义赋值运算符或复制构造函数。

一旦您调整了Album 的大小,这会使所有Songs 包含无效指针。

【讨论】:

  • 如果您的意思是 char* 名称,那就是专辑的名称,不知道这对指向 Song 的指针有何影响。 Btw Song 由 char* title 和 char* author 组成,如果您认为将它们更改为 string 我可以尝试,但不要认为这会有所帮助。
  • @user3144334 我写了Song,因为我的意思是Song,而您的titleauthor 指针与我所怀疑的完全一样。
  • 嗯,我将每个 char* 更改为字符串,现在它不会崩溃。但是在我超过 INIT_CAPACITY 之后它仍然不会打印:(
  • 别担心我修好了,似乎对于 Song = 运算符我忘了返回 Song& 而是我写了 Song。猜猜在 {newsongs[i] = song[i];删除[]歌曲;歌曲=新闻歌曲;}是问题
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2023-03-03
  • 2018-06-29
  • 2018-07-24
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
相关资源
最近更新 更多