【问题标题】:Dynamic Array deleting old pointer and setting it to new array C++动态数组删除旧指针并将其设置为新数组 C++
【发布时间】:2013-10-17 00:22:12
【问题描述】:

我正在尝试实现一个 insert() 函数,该函数应该将一个值插入一个布尔数组并将等于该值的索引设置为“真”。 IntSet 对象有一个指针,value,指向一个布尔数组和一个 int,size,用于保存数组的大小。所以IntSet A(2, 4, 10); 将创建一个大小为 10 的数组,并将 2、4、10 处的索引设置为 true。

insert() 函数根据是否插入值返回 true 或 false,如果插入的值大于数组的大小,它应该调整数组的大小。因此,A.insert(1000); 会将数组大小调整为 1001,并将索引 1000 处的值设置为 true。

我的问题是删除旧数组指针并将其设置为新的、调整大小的数组。不管我做什么,它总是在 delete[] 处中断,我不知道为什么。

这是我目前所拥有的:

bool IntSet::insert(int toInsert) {

int tempSize = this->size;

// if toInsert is greater than the number of elements in the array, call 
// copy constructor and assign new value to true
if(toInsert < this->size && toInsert >= 0) {

    value[toInsert] = true;
    return true;
}
IntSet largerSet(toInsert+1);
if(toInsert > this->size+1) {


    for(int i = 0; i < largerSet.size+1; i++) {

        largerSet.value[i] = false;
    }

    largerSet.value[toInsert] = true;

    for(int i = 0; i < tempSize+1; i++) {

        if(this->value[i] != false) {
            largerSet.value[i] = true;
        }
    }

    std::swap(value, largerSet.value);
    std::swap(size, largerSet.size);
}

return true;
}

编辑:使用交换将值移动到当前数组。

我希望我的解释足够清楚,如果您需要更多说明,我很乐意提供更多代码。这是一个课堂作业,所以我不期待一个直接的答案,但任何能指出我正确方向的东西都会有很大帮助。

谢谢大家!

【问题讨论】:

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


    【解决方案1】:

    您应该将分配留给构造函数,将释放留给析构函数,将副本留给复制构造函数和复制赋值运算符。你现在有了一个可以完成所有事情的函数。

    一种干净的重新分配方法是首先提供一个swap 函数(交换指针+大小);鉴于此,创建一个新大小的临时对象(如largerSet),初始化新数据,然后将您的集合与largerSet 交换。当临时对象超出范围时,它会被销毁,并自动调用delete[]

    现在当largerSet 超出范围时,largerSet.value 会被删除(我假设这是在您的析构函数中完成的),但现在这等于value,所以您的数据已经消失了。

    【讨论】:

    • 非常感谢您提供的信息。问题是我不能再添加任何函数,我们被告知要在 insert() 中完成调整大小和重新分配。问题是它甚至没有调用 delete[] 而是在尝试时中断:/
    • 好的,然后提供内联交换操作:std::swap(value,largerSet.value); std::swap(size,largerSet.size);。删除 tempSetnewSet。删除delete[],只在析构函数中留下一个。有一个析构函数,不是吗?
    • 谢谢,这绝对解决了将值移动到新数组的问题。但是一旦函数超出范围并调用析构函数来删除更大的Set,它就会中断。我在插入函数中不再有 delete[],我删除了 tempSet 和 newSet。这是我的析构函数:delete[] (this-&gt;value);this-&gt;value = NULL;
    • 听起来不错。我仍然可以看到其他可能会或可能不会导致程序中断的问题(如果条件,for 循环中的大小......)。但我倾向于重写而不是正确,而且我需要整个代码。简而言之,toInsert 应该是无符号的;第二个if 不应该在那里; false 的初始化是无用的,如果允许,所有复制都应该是构造函数的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2011-02-18
    • 1970-01-01
    • 2016-10-20
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多