【问题标题】:malloc( ): memory corruption (fast) error C++malloc():内存损坏(快速)错误 C++
【发布时间】:2014-10-26 02:34:17
【问题描述】:

我正在使用 C++。我正在研究一种更改堆栈最大容量的方法,但我对遇到的错误感到困惑。下面是我的方法。

void Stack::setCapacity(unsigned newCapacity){
if(newCapacity< this->getSize()){
    throw StackException("setCapacity()", 
    "the size is larger than the desired capacity");
} else {
    if(newCapacity != myCapacity){
        Item * tempArray = new Item[newCapacity];
        if(newCapacity < myCapacity){
            for(unsigned i=0; i<newCapacity;i++){
                tempArray[i] = myArray[i];
            }
        } else if (newCapacity > myCapacity) {
            for(unsigned i=0; i<myCapacity; i++){
                tempArray[i] = myArray[i];
            }
        }
        for(unsigned i=0; i<newCapacity; i++){
            myArray[i] = tempArray[i];
        }
        delete tempArray;
    }
    myCapacity = newCapacity;
} 
}

我还编写了一个测试方法来测试我的 setCapacity( ) 方法是否有效。

void StackTester::setCapacityTest() {
cout << "- setCapacity... " << flush;

// empty stack
Stack st7(5);
assert(st7.getSize() == 0);
assert(st7.getCapacity() == 5);
st7.setCapacity(7);
assert(st7.getCapacity() == 7);
cout << " 1 " << flush;

// partially filled stack - larger capacity
Stack st8(5);
assert(st8.getCapacity() == 5);
st8.push(3);
st8.push(4);
st8.setCapacity(7);
assert(st8.getCapacity() == 7);
assert(st8.getTop() == 4);
st8.pop();
assert(st8.getTop() == 3);
cout << " 2 " << flush;

// size larger than new capacity
try{
Stack st9(3);
st9.push(7);
st9.push(4);
st9.push(11);
assert(st9.getSize() == 3);
st9.setCapacity(2);
cerr << "setCapacity's new capacity is larger than the size";
exit(1);
} catch(StackException& se){
    cout << " 3 " << flush;
}

// partially filled stack - smaller capacity
Stack st10(5);
assert(st10.getCapacity() == 5);
st10.push(1);
st10.setCapacity(2);
assert(st10.getCapacity() == 2);
assert(st10.getTop() == 1);
cout << " 4 " << flush;

// fully filled stack - larger capacity
Stack st11(2);
assert(st11.getCapacity() == 2);
st11.push(3);
st11.push(7);
assert(st11.getTop() == 7);
st11.setCapacity(3);
assert(st11.getCapacity() == 3);
cout << " 5 " << flush;

cout << " Passed!" << endl;
}

当我通过注释掉其余部分来单独运行测试的每个部分时,一切正常。测试的每个部分都通过。但是,当我合并这些部分并尝试运行整个测试时,我收到以下错误:

* 检测到 glibc ** * /home/.../StackProject: malloc(): 内存损坏(快速):0x0000000001e86030 *

使用调试器,我将问题缩小到在堆栈中创建 myArray。例如,在我的测试中成功运行“1”后,“2”中st8(5)中myArray的创建导致程序崩溃。

我的主要困惑是因为每个部分都单独通过,但它们没有集体通过。我不知道该怎么办。我的方法写错了吗?如果是这样,我应该如何纠正它?

谢谢。

【问题讨论】:

  • setCapacity 到底发生了什么?你能发布你对 Stack 的类定义吗?
  • 为什么malloc在标题中而不是在代码中。第二个代码 sn -p wrt indentation 发生了什么
  • Stack::setCapacity 什么都不做
  • @EdHeal 不正确!它泄漏内存。就是这样。
  • @Barry - 授予并浪费时间

标签: c++ stack malloc glibc capacity


【解决方案1】:

你有

delete tempArray;

但它是一个数组,所以你必须这样做:

delete [] tempArray;

(虽然我不知道这个函数在做什么或为什么......)

【讨论】:

    【解决方案2】:

    我在setCapacity 中看到以下问题,在以下代码块中:

      if(newCapacity != myCapacity){
         Item * tempArray = new Item[newCapacity];
         if(newCapacity < myCapacity){
            for(unsigned i=0; i<newCapacity;i++){
               tempArray[i] = myArray[i];
            }
         } else if (newCapacity > myCapacity) {
            for(unsigned i=0; i<myCapacity; i++){
               tempArray[i] = myArray[i];
            }
         }
    
         // When newCapacity > myCapacity, myArray does not
         // have enough space for this loop.
         // Say myCapacity = 5 and newCapacity = 7
         // Accessing myArray[5] and myArray[6] is a problem.
    
         for(unsigned i=0; i<newCapacity; i++){
            myArray[i] = tempArray[i];
         }
    
         // You are deleting the newly allocated array, even though you are using
         // the wrong delete operator.
         // myArray still points to the old allocated memory.
         delete tempArray;
      }
    

    你需要的是:

      if(newCapacity != myCapacity){
         Item * tempArray = new Item[newCapacity];
         if(newCapacity < myCapacity){
            for(unsigned i=0; i<newCapacity;i++){
               tempArray[i] = myArray[i];
            }
         } else if (newCapacity > myCapacity) {
            for(unsigned i=0; i<myCapacity; i++){
               tempArray[i] = myArray[i];
            }
         }
    
         // Need to delete the old array and keep the new array.
    
         Item* oldArray = myArray;
         myArray = tempArray;
    
         // Use the array delete operator, not the simple delete operator.
         delete [] oldArray;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2020-04-11
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多