我正在用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之外,直到我定位数组的内存。或者数组在一个函数中只有一个局部变量的行为。这意味着,存储数组值的内存将在函数完成后被重新定位,并且我的数组的内存地址可以在稍后的程序中用其他东西重写。
谢谢。
发布于 2011-06-19 07:25:12
首先,它当然会存在于外部,这就是动态分配的全部内容。此外,变量本身是全局的。此外,它应该是一个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>,这样您就可以安全地修改内容,而不必担心内存管理。尽管如此,这将不再是一个单独的块。现在我要问的是,您到底想如何将缓冲区传递给套接字?
发布于 2011-06-19 07:27:39
实际上,您的function_1()中有一个致命错误。下面的代码将导致array指向一个值为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而不是普通数组。
发布于 2011-06-19 07:24:02
因为array是全局的,所以它对其他函数是可见的。在被delete[]释放之前,使用new[]分配的内存会一直存在。
https://stackoverflow.com/questions/6399500
复制相似问题