在函数内部创建全局动态数组
create global dynamic array inside the function
我正在用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;
}
我的问题是:我不确定数组是否会存在于初始化它的函数_1之外,直到我对数组的内存进行去定位。或者数组在一个函数中只有局部变量的行为。这意味着,存储数组值的内存将在函数完成后被删除,并且我的数组的内存地址可以在稍后的程序中用其他东西重写。
谢谢。
首先,它当然会存在于外部,这就是动态分配的全部内容。此外,变量本身是全局的。此外,它应该是一个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的字符。然后,它会覆盖相邻内存的各个部分,基本上会导致缓冲区溢出。
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::矢量而不是普通数组。
由于array
是全局的,因此它对其他函数可见。分配给new[]
的内存一直保留到delete[]
释放为止。
它将存在并且是全局的,因为char * array
指针是全局的。
程序退出函数范围后,在函数1中分配的内存将保持分配状态,并将在函数2和3中按预期工作。但是,请注意,如果在函数1之前调用函数2和3,则该行为是未定义的。不过,总的来说,你在这里试图做的看起来是糟糕的设计,但为了这个问题,我现在不会打扰你:)
如果您使用,它将大大提高代码的清晰度
- 使用std::矢量,尤其是当您计划稍后调整其大小时
- 使用std::string表示字符串
-
通过引用需要它的函数来传递数组或向量。
int main() { std::vector<std::string> vect; function_1(vect); function_2(vect); }
你的功能看起来像什么:
void function_1(std::vector<std::string> & Vect)
typedefs
帮助管理参数类型
这样,您就不必担心泄漏,因为矢量在超出范围时会自行解除分配。
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 输出没有重复元素的动态数组(收缩数组)C++
- 正在插入动态数组
- 如何在动态数组上使用搜索函数
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 静态数组的自由动态数组
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- C++ 使用存储在动态数组中的文本文件中的数据查找模式
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 为什么 c++ 动态数组的大小没有改变?
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 指针的 C++ 动态数组 - 何时需要使用它?
- 删除动态数组时未定义标识符
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 动态数组的 C++ 重载加运算符
- 基于数组的列表 - 动态数组创建时出错