【问题标题】:Object was probably modified after being freed C++?对象可能在被释放 C++ 后被修改?
【发布时间】:2016-04-25 22:05:16
【问题描述】:

此函数将元素插入到动态数组中。当我注释掉 delete [] 数组时出现此错误,但如果我不这样做,一切正常.. 那是我插入数组顺利。安迪知道为什么?

错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。 *** 在 malloc_error_break 中设置断点进行调试

#include <iostream>

#include "dynamic_array.h"

using namespace std;

dynamic_array::dynamic_array() {
    try {
        array = new int[0];
                size = 0;
        allocated_size = 5;
    } catch ( const std::bad_alloc& e ) {
            throw exception(MEMORY_EXCEPTION);
    }           
}

dynamic_array &dynamic_array::operator=(const dynamic_array &a) {

    return *this;
}

dynamic_array::~dynamic_array() {
    delete [] array;
}

int dynamic_array::get_size(void) const {
    return size;
}

int dynamic_array::get_allocated_size(void) const {
    return allocated_size;

}

int& dynamic_array::operator[](unsigned int i) {
    if (i >= get_size())
        throw exception(SUBSCRIPT_RANGE_EXCEPTION);
    else
        return array[i];
}

const int& dynamic_array::operator[](unsigned int i) const {
    if (i >= get_size())
        throw exception(SUBSCRIPT_RANGE_EXCEPTION);
    else
        return array[i];

}

void dynamic_array::insert(int x, int i) {

    try {if (i < 0 || i > get_size())
        throw exception(SUBSCRIPT_RANGE_EXCEPTION);
        if(size == 0){
        array[i] = x;
        size++;}
        else if(allocated_size == size){
            int *array2;
            array2 = new int[allocated_size+5];
            allocated_size += 5;
            for(int j=0;j<=size-1;j++)
            array2[j] = array[j];
            //delete [] array;
            array = array2;
            shift_right(i,size-1,1);
            array[i] = x;
            size++;
        }
        else{
            shift_right(i,size-1,1);
            array[i] = x;
            size++;
        }
    } catch ( const std::bad_alloc& e ) {
            throw exception(MEMORY_EXCEPTION);
    }
}

void dynamic_array::shift_right(int start, int end, int delta) {
    if(0 <= start && start <= end & end <= size){
    int temp [size];
    int s = 0;
    for(int i = start; i <= end; i++){
    temp[s] = array[i];
    s++;
    }
    int d = 0;
    for(int j = start + delta ; j< sizeof(temp)+end; j++){
    array[j] = temp[d];
    d++;}
}

}

【问题讨论】:

  • arraynew[]ed?
  • 请提供mcve。很可能您在调用 ccde 的某个地方有一个指向旧数组的指针,并且在您删除数组后正在使用它。
  • 上传了全部内容。
  • if(size == 0){ array[i] = x; 写入超出范围,因为此时您只为 0 个整数分配了空间
  • array = new int[0]; 不完全匹配 allocated_size = 5;

标签: c++ dynamic-arrays dynamic-allocation


【解决方案1】:

shift_right 出现问题,我不得不重写。移位超出了为数组分配的大小,修复后该错误消失了。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 2014-01-11
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多