C++ 在函数中创建struct对象并传递其指针
我试图将一个空的结构指针作为输出参数传入一个名为“initialize”的函数,然后在函数完成后,我可以检索结构指针指向的对象。一些意想不到的行为发生了,我不太明白 下面是我的代码:C++ 在函数中创建struct对象并传递其指针,c++,pointers,struct,C++,Pointers,Struct,我试图将一个空的结构指针作为输出参数传入一个名为“initialize”的函数,然后在函数完成后,我可以检索结构指针指向的对象。一些意想不到的行为发生了,我不太明白 下面是我的代码: static void initialize(complex_struct*& infoPtr) { complex_struct myInfo; infoPtr = &myInfo; // some other codes that modify the contents
static void initialize(complex_struct*& infoPtr)
{
complex_struct myInfo;
infoPtr = &myInfo;
// some other codes that modify the contents of myInfo
infoPtr->input_components = 3;
}
static void myfunction()
{
complex_struct* infoPtr = nullptr;
initialize(infoPtr);
std::cout << infoPtr->input_components << std::endl;
}
静态无效初始化(复杂结构*&infoPtr)
{
复杂结构myInfo;
infoPtr=&myInfo;
//其他一些修改myInfo内容的代码
infoPtr->input_components=3;
}
静态函数()
{
复杂结构*infoPtr=nullptr;
初始化(infoPtr);
std::cout input_components您试图使用指向其作用域函数之外的局部变量的指针。在您的示例中,myInfo
instance insideinitialize()退出函数后,
将被删除,并且您记住的地址将指向随机垃圾内存。切勿使用指向其作用域之外的局部变量的指针
如何解决此问题?最简单的方法是在此处放弃指针,而是通过非常量引用传递结构。代码如下所示:
void initialize(complex_struct& info)
{
// some other codes that modify the contents of myInfo
info.input_components = 3;
}
void myfunction()
{
complex_struct info;
initialize(info);
std::cout << info.input_components << std::endl;
}
您正在返回指向堆栈框架中某个对象的指针。当函数返回时,该对象将被删除。您在myfunction
中有一个悬空指针
解决问题的方法:
从堆中分配内存
static void initialize(complex_struct*& infoPtr)
{
infoPtr = new complex_struct ;
infoPtr->input_components = 3;
}
确保在调用函数中释放内存
使用对象而不是指针
static void initialize(complex_struct& info)
{
info.input_components = 3;
}
并更改其用法:
static void myfunction()
{
complex_struct info;
initialize(info);
std::cout << info.input_components << std::endl;
}
static void myfunction()
{
复杂结构信息;
初始化(信息);
std::您是否返回(通过指针引用)指向堆栈对象的指针,该堆栈对象在initialize
开始时初始化,在initialize
结束时销毁。陈旧指针是一个错误指针。代码行是否“complex_struct myinfo;”涉及耗时的内存分配本身吗?我试图将内存分配活动保持在initialize()中函数,以便执行准确的性能度量。我猜您是在问这是否涉及动态内存分配。答案是:不,不涉及。该对象是使用堆栈内存创建的。
static void myfunction()
{
complex_struct info;
initialize(info);
std::cout << info.input_components << std::endl;
}