在std :: unique_ptr

时间:2016-05-04 09:06:04

标签: c++ sorting c++11 recursion smart-pointers

更新

好的,我终于找到了问题的所在,但事实证明,对它的完整解释比教授复杂得多,所以我需要一些时间来更新我的帖子。 / EM>

我尝试使用在std :: unique_ptr上分配的数组进行合并排序算法。

当我运行应用程序时,它通常会中断并返回0xC0000005或抛出为std :: bad_alloc。

当我使用调试器运行它(表单Code :: Blocks IDE)时,它不会中断,但结果数组上的一些数据是负的,并不是正确的(输入数组包含随机数)值形式0到100)。

我认为在我想要之前会释放一些内存,但所有内存管理都由std :: unique_ptr完成,并且只使用智能指针来访问动态内存。

std :: move是否有可能不会立即转让所有权,还是会有所不同?

我正在使用:void mergeSort(SmartPtrArray<T>& array_before)来运行合并排序。

以下是我的代码的片段:

template <typename T>
struct SmartPtrArray
{
    SmartPtrArray() {}
    SmartPtrArray(int i): array(new T[i]), amount(i) {}
    std::unique_ptr<T[]> array;
    int amount;
};

namespace SortingAlgoritms
{

template <typename T>
void merge(SmartPtrArray<T>& array_a, SmartPtrArray<T>& array_b, SmartPtrArray<T>& result_array)
{
    if(result_array.array != nullptr)
        result_array.array.reset();
    std::unique_ptr <T[]> tmp (new T [array_a.amount+array_b.amount]);
    result_array.array = std::move(tmp);// now result_array is only pointer with ownership
    result_array.amount= array_a.amount + array_b.amount;


    if(array_a.array[array_a.amount-1] <= array_b.array[0])//1 case
    {
        for(auto i = 0; i < array_a.amount; i++)
            result_array.array[i] = array_a.array[i];
        for(auto i = array_a.amount; i < ( array_a.amount + array_b.amount ); i++)
            result_array.array[i] = array_b.array[i - array_a.amount];


    }
    else                                                    //2 case
    {
        auto j = 0;
        auto i = 0;
        for(i = 0; i <= array_a.amount; i++)
        {
            while(j < array_b.amount && array_b.array[j] <= array_a.array[i])
            {
                result_array.array[i+j] = array_b.array[j];
                j++;
            }
            result_array.array[i+j] = array_a.array[i];
        }
        while(j < array_b.amount && array_b.array[j] <= array_a.array[i-1])
        {
            result_array.array[i+j] = array_b.array[j];
            j++;
        }

    }
}

template <typename T>
void mergeSort(SmartPtrArray<T>& array_before, SmartPtrArray<T>& result, int begin, int end)
{
    SmartPtrArray<T> tmp_left;
    SmartPtrArray<T> tmp_right;
    int break_point=(end+begin)/2;;
    if(end-begin > 1)
    {
        mergeSort(array_before, tmp_left, begin, break_point);
        mergeSort(array_before, tmp_right, break_point, end);
        merge(tmp_left, tmp_right, result);
    }
    else
    {
        if(result.array!=nullptr)
            result.array.reset();
        SmartPtrArray<T> tmp(1);
        tmp.array[0] = array_before.array[begin];
        result.array=move(tmp.array);
        result.amount=1;
    }

}
template <typename T>
void mergeSort(SmartPtrArray<T>& array_before)
{
    SmartPtrArray<T> tmp_left;
    SmartPtrArray<T> tmp_right;
    int break_point=array_before.amount/2;
    if(array_before.amount!=1)
    {
        SmartPtrArray<T> result;
        mergeSort(array_before, tmp_left, 0, break_point);
        mergeSort(array_before, tmp_right, break_point, array_before.amount);
        merge(tmp_left, tmp_right, result);
        if(array_before.array!=nullptr)
            array_before.array.reset();
        array_before=std::move(result);
    }
}

}

带调试器的示例输出:

  

生成数组

     

阵列排序前:40 22 24 21 39 10 80 44 8 20 21

     

结果数组:8 10 20 21 21   -1414812757 22 24   -1414812757   -1163005939

0 个答案:

没有答案