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