如何动态分配全局int *?

时间:2019-04-13 21:46:41

标签: c++ global-variables mergesort multiple-definition-error

我正在尝试在C ++中执行合并排序代码,并且为了避免占用大量内存,我想将辅助向量声明为全局变量。如您所知,使用全局变量策略时,使用的空间为 O(1),而使用其他变量时,使用的空间为 O(N logN)。 但是有一个小问题,我不知道将用于测试代码的向量的大小,因此我需要动态分配全局变量。

我已经尝试做类似的事情:

这是来自.h存档:

void mymergesort_recursive(std::vector<int> &v, SortStats &stats, int i = 0, 
                           int f = 0, bool nouveau = true);
int *aux = nullptr;

这是来自.cpp存档:

void mymergesort_recursive(std::vector<int> &v, SortStats &stats, int i, 
                           int f, bool nouveau) {
    if (nouveau) {
        stats.recursive_calls = 1;
        f = int(v.size());
        // Allocates the variable aux according with the vector size. This makes a lot of memory economy.

        aux = new int[f];
    } else {
        ...
    }
    ...
}

实际上,我也尝试过:

aux = (int *)malloc(f * sizeof(int));
aux = static cast <int*>(malloc(f * sizeof(int)));

其他导致相同错误的尝试和错误可能性:-(

  

“ aux”的多个定义

我在这里的这个论坛上已经寻找了其他一些问题,但是尽管有很多类似的问题,我也无法针对这个问题提取解决方案。

我认为已经清楚地说明了问题,但是如果有不清楚的地方,请询问。

2 个答案:

答案 0 :(得分:0)

错误是您在标头上声明了一个变量。

您应该在标题上放置

extern int* aux;

然后在.cpp文件中输入:

int* aux= nullptr;

无论如何,您应该认真考虑而不是int* aux使用std::vector<int> aux;

  • 它将为您保留元素数量
  • 空白时几乎不会使用任何空间。
  • 它将根据需要增长。
  • 在使用内存进行优化之前,您可以reserve进行存储。
  • 您无需致电delete / free

答案 1 :(得分:0)

使用全局辅助向量将不会实现 O(1)的存储空间开销,该向量的大小将是您尝试排序的最大向量的大小(或者至少是您尝试排序的向量的一半)。聪明的实现),因此 O(N)空间开销。

此外,使用全局变量会使代码不可重入,也不是线程安全的,并在排序完成后保留开销。

这是一种更好的方法:

  • 编写一个递归mergesort_helper函数,该函数使用此临时数组在合并阶段存储左子数组。
  • mergesort函数中,分配一个大小为(N + 1) / 2个元素的临时数组,并将其传递给递归mergesort_helper函数。
  • 释放临时数组
  • 返回到呼叫者。