2013-03-23 218 views
3

我定义对象的函数中:C++函数中定义的对象在超出作用域后会被销毁吗?

SoundFXSystem* Engine::GetSystem(){ 
    SoundFXSystem system; // var defined inside a function 
    sEngine->GetSystem(&system); 
    return &system; // can I return the address of the var? 
} 

是合法的返回变种的地址,并在后面的程序中使用它?当函数退出并且不能被调用者使用时,它会立即超出范围吗?

编辑:如果我如下定义对象,它会被动态分配吗?

SoundFXSystem* Engine::GetSystem(){ 
    SoundFXSystem* system = new SoundFXSystem(); // var defined inside a function 
    sEngine->GetSystem(&system); 
    return system; 
} 
+0

永远不会返回一个非静态局部变量的地址。它是**未定义的行为**,以解除引用所述地址一个它所在的范围。 – WhozCraig 2013-03-23 12:31:10

+0

[通过指针从C和C++函数返回本地数据](http:// stackoverflow。com/questions/3127507/returns-local-data-from-functions-in -c-and-c-via-pointer) – 2013-03-23 13:16:54

+1

**每个**对象在超出范围时都会被销毁。 – 2013-03-23 15:54:42

回答

8

是的,对象是在函数的作用域中定义的,所以当函数的作用域结束时它就超出了作用域。您需要:

  1. 返回它的值,而不是,或

  2. 动态分配的,即使用newstd::make_shared

如果你将它分配使用new,使以后肯定有人会知道delete。这就是为什么它最好返回std::unique_ptr而不是来自分配函数的原始指针 - 它避免了可能的内存泄漏。

要通过价值回报,而不是,你会改变你的功能如下:

SoundFXSystem Engine::GetSystem(){ 
    SoundFXSystem system; // var defined inside a function 
    sEngine->GetSystem(&system); 
    return system; //return var by value 
} 
+0

您还应该提到,这是因为该对象是在当前激活框架中创建的,并且函数返回时,此框架将从堆栈中“删除”。 – assafmo 2013-03-23 12:32:18

+0

我已经更新了我的问题,你能回答第二部分吗? – 2013-03-23 12:32:36

+0

第二部分将被动态分配,并且应该在将来手动释放。 – assafmo 2013-03-23 12:33:55

3

关于第二个问题:是的,它会动态地分配在堆上并需要deleteð一旦你”重新完成它。

一个愚蠢的问题:这段代码的目的是什么?你将引用传递给一个指针......除非你想要内存泄漏,否则不要改变它。你可能只想传递指针(没有&,改变对象,而不是指向对象的指针)。

关于“通过价值回报”:

SoundFXSystem Engine::GetSystem(){ 
    SoundFXSystem system;   //Declares the local object 
    sEngine->GetSystem(&system); //Passes the pointer to the object 
    return system;     //Returns a 'Value Copy' of the object. 
} 
+0

如何返回它按价值?你能举一个例子吗? – 2013-03-23 12:34:17

+0

@Geotarget:'SoundFXSystem Engine :: GetSystem(){SoundFXSystem system; sEngine-> getSystem(&system);退货制度; }'。 – DevSolar 2013-03-23 12:36:52

+0

哪里有对OP代码中的指针的引用? – Angew 2013-03-23 12:39:47

2

这工作,但它的危险:

SoundFXSystem* Engine::GetSystem(){ 
    SoundFXSystem* system = new SoundFXSystem(); // var defined inside a function 
    // ... 
    return system; 
} 

您与原始指针(SoundFXSystem*),然后工作,编译器不会自动销毁物体。您可以通过调用

delete p; 

其中pSoundFXSystem*具有相同的值Engine::GetSystem()system一套自己做。这不是直截了当的,因为它似乎是由于抛出异常的可能性。这是更好地使用智能指针(例如unique_ptrshared_ptr):

std::shared_ptr<SoundFXSystem> Engine::GetSystem(){ 
    auto system = std::make_shared<SoundFXSystem>(); // var defined inside a function 
    // ... 
    return system; 
} 
+0

切勿将指针返回到动态分配的内存。没有与指针相关的所有权概念,因此导致内存泄漏。任何动态内存分配都应该包含在一个控制寿命的包含对象中(通常为智能指针)。 – 2013-03-23 16:40:16

相关问题