在函数内创建全局动态数组

时间:2011-06-18 23:19:49

标签: c++ arrays memory dynamic allocation

我正在用C ++编写一个程序。在我的程序中,我需要在一个函数内创建一个动态大小的数组,但是这个数组也应该可以访问其他函数。我不会在这里发布我的代码,只写一个虚拟的例子。

char *array;


void function_1() {
    array = new char(3);
    array[0] = "value 1";
    array[1] = "value 2";
    array[2] = "value 3";
}

void function_2() {
    array[0] = "new value 1";
}

int main() {
    function_1();
    function_2();

    delete[] array;
}

我的问题是:我不确定,如果数组将存在于function_1之外,它已经初始化,直到我分配数组的内存。 或者数组在一个函数中只有一个局部变量的行为。这意味着,存储数组值的内存将在函数完成后被解除定位,并且我的数组的内存地址可以在我的程序中稍后重新编译。

谢谢。

6 个答案:

答案 0 :(得分:7)

首先,当然它将存在于外部,这就是动态分配的全部内容。此外,变量本身是全局的。此外,它应该是char const** array;,分配应该是new char const*[3](注意方括号)。 const,因为您不会在此处更改字符串的内容。

其次, 不这样做 。只需将其放入课堂并使用std::vector

#include <vector>

class Foo{
public:
  function_1(){
    _array.push_back("value 1");
    _array.push_back("value 2");
    _array.push_back("value 3");
  }

  function_2(){
    _array[0] = ("new value 1");
  }

private:
  std::vector<std::string> _array;
};

int main(){
  Foo f;
  f.function_1();
  f.function_2();
}

更好的是,拥有std::vector<std::string>,这样您就可以安全地修改内容,而无需担心内存管理问题。虽然,对此不再是一个单独的块。现在我想问一下,你究竟想把缓冲区传递给套接字?

答案 1 :(得分:3)

你的function_1()实际上有致命错误。下面的代码将导致数组指向一个字符,值为3.然后,它将覆盖相邻内存的各个部分,基本上导致缓冲区溢出。

void function_1() {
    array = new char(3);
    array[0] = "value 1";
    array[1] = "value 2";
    array[2] = "value 3";
}

您可能想要做的是创建类似的东西:

char **array;
array = new char*[3];
array[0] = new char[strlen(...)];
array[0] = strncpy(array[0], ..., strlen(...)];
// etc

更安全,更清晰的方法是完成Xeo的建议,并使用std :: vector而不是普通数组。

答案 2 :(得分:2)

由于array是全局的,因此其他功能可以看到它。分配有new[]的内存会一直保留,直到被delete[]释放。

答案 3 :(得分:2)

它将存在并且是全局的,因为char * array指针是全局的。

答案 4 :(得分:2)

您在function1中分配的内存将在程序退出函数范围后保持分配,并在函数2和3中按预期工作。但请注意,如果在函数1之前调用函数2和3,则该行为是未定义的。一般来说,你在这里尝试做的事情看起来像是糟糕的设计,但为了这个问题,我现在不会对你有所了解:)

答案 5 :(得分:2)

如果您:

,它将极大地提高代码的清晰度
  • 使用std :: vector,特别是如果您打算稍后调整大小
  • 使用std :: string表示字符串
  • 通过引用传递数组或向量来获取需要它的函数。

    int main() {
    std::vector<std::string> vect;
    
    function_1(vect);
    function_2(vect);
    }
    

您的功能如下:

void function_1(std::vector<std::string> & Vect) 

typedefs帮助管理参数类型

这样您就不必担心泄漏,因为当超出范围时,向量将释放自身。