Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ - Fatal编程技术网

C++ C++;函数作用域/销毁中的指针

C++ C++;函数作用域/销毁中的指针,c++,C++,请原谅这个问题,因为它可能是基本的。此外,我在谷歌上搜索了很多,但我发现的都是使用明显导致内存泄漏的实现的示例 请注意以下伪代码: void myArbitraryFunc(){ ... // Create Pointer to parent class MyParentClass* parent = (MyParentClass*)this.getParent(); parent->doSomething(someData); ... }// Is parent destroyed he

请原谅这个问题,因为它可能是基本的。此外,我在谷歌上搜索了很多,但我发现的都是使用明显导致内存泄漏的实现的示例

请注意以下伪代码:

void myArbitraryFunc(){
...
// Create Pointer to parent class
MyParentClass* parent = (MyParentClass*)this.getParent();
parent->doSomething(someData);
...
}// Is parent destroyed here?

我不是指父类,而是指我在函数体中声明的指针“parent”。当它超出范围时会被销毁,对吗?若有,原因为何?如何创建类指针的副本而不将其绑定到原始父级?

指针
父级
被销毁。然而,它所指的并没有被摧毁

指针本身只是堆栈上的一个变量,当堆栈展开时,当当前作用域结束时,指针就会消失。从概念上讲,它与此代码没有什么不同:

void myArbitraryFunc() {
    ...
    int parent = 42;
    ....
} // parent goes away
考虑它的方式是指针只是一个数字,这个数字是指向的对象的内存地址

现在在您的示例中,我们假设MyParentClass对象本身是由其他对象创建的,并且是由其他对象拥有的,因此
myArbitraryFunc
不负责删除它


指针实际上只是一个数字和对象的“地址”。把记忆想象成一个巨大的盒子,里面有一个数字。您要求系统创建一个对象,它会这样做,并告诉您该对象在框42中。显然,编写“42”的副本对对象本身没有任何影响。它只是复制了很多地址。

指针
父项
被销毁。出于同样的原因,任何局部变量(如
int
)都会被销毁。如果希望它持久化,请将其存储在类成员中或返回。@尼尔·柯克感谢您澄清它类似于int。但是,通过返回指针,我不是在传递对父类的访问权限吗?如果我只是想传递一个doppleganger/不相关的副本呢?是的,你会的。您想返回原始对象的副本吗?我觉得这两个问题似乎是相辅相成的正如我在上面发布的:“然而,通过返回指针,我不是在传递对父类的访问吗?如果我只是想传递一个doppleganger/不相关的副本呢?”指针只是一个数字。把它想象成一个标签
getParent
未返回对象。它返回一个数字,让您可以找到对象。我理解这一点,但假设我想创建一个重复的(不相关的指针)这是该对象在调用函数时所拥有的全部内容,而不允许访问应用程序管道下游的第一个指针类?要创建该对象的副本,可以使用赋值运算符或复制构造函数。如果这两个类都不是由父类实现的,请查看父类的声明,以查看它们是否提供了克隆类型的接口。建议不要使用编译器定义的赋值运算符或复制构造函数。