可视化C++对象可见性

visual C++ object visibility

本文关键字:可见性 对象 C++ 可视化      更新时间:2023-10-16

的区别是什么

std::string a;

 std::string* a = new std::string();

如果两个对象都是作为方法调用的结果创建的?这两个物体对外界"可见"吗?它们什么时候会被摧毁,或者永远不会被摧毁?

谢谢。

我假设您在函数范围内定义这些。

存储持续时间

std::string a;

这定义了一个名为a、类型为std::string的变量。它创建了一个具有自动存储持续时间的std::string类型的对象,这意味着当变量超出范围时,它将被销毁。

std::string* a = new std::string();

这定义了一个名为a的变量,类型为std::string*(指向std::string的指针(。它创建了一个具有自动存储持续时间的std::string*类型的对象,这意味着当变量超出范围时,它将被销毁。也就是说,指针将在作用域的末尾被销毁。

该指针使用新表达式new std::string()初始化。此表达式动态分配std::string对象并返回指向该对象的指针。此对象具有动态存储持续时间,必须使用delete a;手动删除。这会破坏a指向的对象。

可见性

可见性是名称的特性,而不是对象的特性。在这两种情况下,声明的名称a在作用域中时是可见的,而不是隐藏的。

可见性相同,生存期不同。

一旦a超出范围,第一个string就会被删除。

在手动调用delete a; 之前,第二个string不会被删除

假设它们都是在一个方法(函数(中创建的。

  • 函数一返回,第一个就被销毁
  • 只要你不在上面打delete,第二个就可以活下去

string* flunk() {
    std::string str;
    std::string* str_p = new std::string; // This lives on
    return str_p;
    // str->~();  destructed here. 
}

两者具有相同的可见性,这取决于它们的声明位置。

第一个字符串将在变量作用域的末尾自动处理。除非使用存储在变量中的地址调用delete,否则不会删除第二个。

std::string a; 

将在当前作用域的末尾被销毁(通常是一个结束}(。

std::string* a = new std::string();

当你对它调用delete时,它将被销毁。

delete a;

至于可见性,它取决于它在代码中的位置;同样,它将在当前作用域中可见(用大括号分隔(,或者如果是类的一部分,则通过类访问(public、protected或private(可见。

区别在于,在第一种情况下:

std::string a;

在堆栈上创建一个std::string对象。当对象超出范围时,它会自动销毁。

在第二种情况下:

std::string* a = new std::string();

a是指向堆上std::string对象的指针,当显式调用delete a时,该对象将被销毁。

关于可见性,两者都在当前范围内可见。