C++ 为什么将指针指定为动态对象和数组有效?

C++ 为什么将指针指定为动态对象和数组有效?,c++,dynamic,C++,Dynamic,首先,我想知道以下是“合法的”还是至少是“不邪恶的” 第二,我想知道内部正在发生什么,使之成为可能!这是令人惊讶和非常奇怪的,我知道指针可能被认为是通过其内存地址间接访问对象的方式,因此我认为正是因为如此,指针可以重定向到动态对象和数组上的点,即使在其声明和多次赋值之后也是如此 例如: #包括 #包括 int main() { 大小; std::cout>大小; /*创建指向单个动态字符串的指针*/ std::string*指针=新std::string(); 指针->附加(“某些文本”); s

首先,我想知道以下是“合法的”还是至少是“不邪恶的”

第二,我想知道内部正在发生什么,使之成为可能!这是令人惊讶和非常奇怪的,我知道指针可能被认为是通过其内存地址间接访问对象的方式,因此我认为正是因为如此,指针可以重定向到动态对象和数组上的点,即使在其声明和多次赋值之后也是如此

例如:

#包括
#包括
int main()
{
大小;
std::cout>大小;
/*创建指向单个动态字符串的指针*/
std::string*指针=新std::string();
指针->附加(“某些文本”);

std::cout代码定义了行为,工作正常。除了泄漏最后一次分配之外,没有问题,这不是真正的最佳(但合法)。在末尾添加一个
delete[]指针;


new
的数组版本不返回新创建的数组或对它的指针或引用,而是返回指向新创建数组中第一个元素的指针

pointer = new std::string[size];
在此之后,指针将指向新创建的
std::string[size]
数组的第一个
std:.string
。只需查看指针,您将不知道它指向的
std::string
是否是数组的一部分

这就是为什么可以通过相同的指针类型引用数组和单个对象的原因。自动数组也是如此,当分配给指针时,自动数组会衰减为指向其第一个元素的指针

这也是为什么作为程序员,您需要记住哪个指针指向分配了
new
的单个对象,哪个指针指向分配了
new[]
的数组,以及该数组的长度(因为在前一种情况下,您需要用
delete
删除它,在后一种情况下,用
delete[]
删除它)


实际上,由于这个原因(以及其他原因),您不应该像这样使用原始
new
。如果您需要动态大小的数组,则应该使用
std::vector
这样的容器,如果您需要动态分配单个对象,则应该使用
std::unique\u ptr
(尽管对于数组也有
std::unique\u ptr
版本).

代码定义了行为,工作正常。没有问题,只是泄漏了最后一次分配,这不是真正的最佳(但合法)。在末尾添加一个
delete[]指针;


new
的数组版本不返回新创建的数组或对它的指针或引用,而是返回指向新创建数组中第一个元素的指针

pointer = new std::string[size];
在此之后,指针将指向新创建的
std::string[size]
数组的第一个
std:.string
。只需查看指针,您将不知道它指向的
std::string
是否是数组的一部分

这就是为什么可以通过相同的指针类型引用数组和单个对象的原因。自动数组也是如此,当分配给指针时,自动数组会衰减为指向其第一个元素的指针

这也是为什么作为程序员,您需要记住哪个指针指向分配了
new
的单个对象,哪个指针指向分配了
new[]
的数组,以及该数组的长度(因为在前一种情况下,您需要用
delete
删除它,在后一种情况下,用
delete[]
删除它)


实际上,由于这个原因(以及其他原因),您不应该像这样使用原始
new
。如果您需要动态大小的数组,则应该使用
std::vector
这样的容器,如果您需要动态分配单个对象,则应该使用
std::unique\u ptr
(尽管对于数组也有
std::unique\u ptr
版本).

显示的代码似乎格式良好。至于“内部发生了什么”C++的C++ C++语言,至少在你找到一个工作来编写你自己的C++编译器和C++库的时候,这是不相关的,在这点上你需要理解的东西。你的C++编译器知道为了使这一点发生什么,需要做什么,并且随着你学习C++的进步,提高你的C++知识。e、 您将更好地理解事情必须如何发生;但就其本身而言,这并不意味着什么。在这两种情况下,指针都指向单个对象;在第二种情况下,相邻内存位置中有更多相同类型的对象。显示的代码似乎格式良好。至于“内部发生了什么”C++的C++ C++语言,至少在你找到一个工作来编写你自己的C++编译器和C++库的时候,这是不相关的,在这点上你需要理解的东西。你的C++编译器知道为了使这一点发生什么,需要做什么,并且随着你学习C++的进步,提高你的C++知识。e、 您将更好地理解事情是如何发生的;但就其本身而言,这并不意味着什么。在这两种情况下,指针都指向单个对象;在第二种情况下,相邻内存位置中有更多相同类型的对象