Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是C+;中带指针的数组的良好用法/代码吗+;?_C++_Arrays_Pointers - Fatal编程技术网

C++ 这是C+;中带指针的数组的良好用法/代码吗+;?

C++ 这是C+;中带指针的数组的良好用法/代码吗+;?,c++,arrays,pointers,C++,Arrays,Pointers,我想问你们,你们是否考虑过这段代码,它是完全错误的还是我对内存的使用不当 这是密码 // Ask for capacity int capacity ; cout << "capacity: "; cin >> capacity; // Declare the array with pointers, this line is very important int *arr = new int; // For 0 until capacity-1 print ask

我想问你们,你们是否考虑过这段代码,它是完全错误的还是我对内存的使用不当

这是密码

// Ask for capacity
int capacity ;
cout << "capacity: ";
cin >> capacity;

// Declare the array with pointers, this line is very important
int *arr = new int;

// For 0 until capacity-1 print ask for the numbers
for (int i = 0; i < capacity; i++)
{
  cout << "number: ";
  cin >> *(arr + i);
}

// Print them
for (int i = 0; i < capacity; i++)
{
  cout << "[" << i << "]: " << *(arr + i) << " in " << arr + i << endl;
}
看,它有效地将数字保存在内存中的正确位置(4位,整数大小) 但是限制是什么呢?我怎么知道我是否在触摸不该触摸的记忆? 因为看,我将数组声明为

int*arr=新int

可以吗

这段代码也一样,但可能会更糟,因为它是一个字符串,一个您可能知道的字符数组

// Declaring the pointer name as new char and ask for it
char *name = new char;
cout << "name in: ";
cin >> name;
cout << "name out\n";
for (int i = 0; *(name + i) != '\0' ; i++)
{
  printf("[%i]: %c\n", i, *(name + i));
}

代码只分配一个
int
对象。修正:

int* arr = new int[capacity];

*(arr+i)
可以更简单:
arr[i]


代码需要删除末尾的数组:

delete[] arr;
或者,最好使用智能指针,以避免手动删除:

std::unique_ptr<int[]> arr(new int[capacity]);
std::unique_ptr arr(新整数[容量]);

或者,更好的方法是使用
std::vector arr(容量)

代码仅分配一个
int
对象。修正:

int* arr = new int[capacity];

*(arr+i)
可以更简单:
arr[i]


代码需要删除末尾的数组:

delete[] arr;
或者,最好使用智能指针,以避免手动删除:

std::unique_ptr<int[]> arr(new int[capacity]);
std::unique_ptr arr(新整数[容量]);


或者,更好的方法是使用
std::vector arr(容量) > 

< P>原始(拥有)指针和手动内存管理在现代C++中几乎从来都不是一个好主意。任何时候都应该使用像
std::array
std::vector
这样的容器,而不是C样式的数组。使用智能指针(如
std::unique_ptr
std::shared_ptr
std::weak_ptr
)对动态资源的所有权和生命周期进行建模要比使用原始指针好得多。不要编写容易出错的代码。使用我们现有的设备,编写代码,很容易得到正确和困难(呃)出错。

< P>原始(拥有)指针和手动内存管理在现代C++中几乎从来都不是好主意。任何时候都应该使用像
std::array
std::vector
这样的容器,而不是C样式的数组。使用智能指针(如
std::unique_ptr
std::shared_ptr
std::weak_ptr
)对动态资源的所有权和生命周期进行建模要比使用原始指针好得多。不要编写容易出错的代码。使用我们现有的工具,编写容易出错的代码。

您将数组分配错了。它应该是
int*arr=newint[capacity]
int*arr=newint分配一个
int
,因此在这种情况下,您询问的限制为1。您只能访问
arr[0]
,其他任何内容都是未定义的行为。下面的答案显示了如何正确分配数组。您是否愿意使用
std::vector
而不是数组?
std::vector foo(vacapacity)ftw@GilbertoMarcano cppreference是C++信息的一个很好的来源。它的页面包含如何使用它的详细说明。您的数组分配错误。它应该是
int*arr=newint[capacity]
int*arr=newint分配一个
int
,因此在这种情况下,您询问的限制为1。您只能访问
arr[0]
,其他任何内容都是未定义的行为。下面的答案显示了如何正确分配数组。您是否愿意使用
std::vector
而不是数组?
std::vector foo(vacapacity)ftw@GilbertoMarcano cppreference是C++信息的一个很好的来源。这是一个关于如何使用它的页面。哦,我明白了,谢谢,字符串呢?如果我想分配一个只有10个字符的字符串或者类似的东西,那么我的代码中的这个字符串是一个没有限制的字符串吗?(在某种程度上,我知道这是错误的)@gilbertomarca对字符串没有用
std::string
。哦,我不知道你推荐我的最后两种方法,当然如果它们更好,我需要学习它们!不过,我还是从这一切开始,谢谢@GilbertoMarcano
new
delete
理解起来很有趣,但在现代代码中几乎不再使用。当你需要存储几个值或对象时,当处理单个对象时,我明白,我实际上是在学习,因为我在我的职业生涯中读到了这些主题,所以明年我将看到C++,我希望在看到Meoh之前知道这些事情,我知道了,谢谢,字符串如何?如果我想分配一个只有10个字符的字符串或者类似的东西,那么我的代码中的这个字符串是一个没有限制的字符串吗?(在某种程度上,我知道这是错误的)@gilbertomarca对字符串没有用
std::string
。哦,我不知道你推荐我的最后两种方法,当然如果它们更好,我需要学习它们!不过,我还是从这一切开始,谢谢@GilbertoMarcano
new
delete
理解起来很有趣,但在现代代码中几乎不再使用。当你需要存储几个值或对象时,当处理单个对象时,我明白,我实际上是在学习,因为我在我的职业生涯中读到了这些主题,所以我明年将看到C++,并且希望在看到这些东西之前,我可以在哪里学习STD::向量?或者std::unique_ptr和那些东西,以及做一些事情的更好方法,它们看起来很有趣,但我仍然不知道@吉尔伯托·马卡诺-总是值得一看。@吉尔伯托·马卡诺,我在哪里可以了解std::vectors?或者std::unique_ptr和那些东西,以及做一些事情的更好方法,它们看起来很有趣,但我仍然不知道@吉尔伯托·马尔卡诺——总是值得一游。@吉尔伯托·马尔卡诺,