Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 在函数中创建struct对象并传递其指针_C++_Pointers_Struct - Fatal编程技术网

C++ 在函数中创建struct对象并传递其指针

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

我试图将一个空的结构指针作为输出参数传入一个名为“initialize”的函数,然后在函数完成后,我可以检索结构指针指向的对象。一些意想不到的行为发生了,我不太明白

下面是我的代码:

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 inside
initialize()退出函数后,
将被删除,并且您记住的地址将指向随机垃圾内存。切勿使用指向其作用域之外的局部变量的指针

如何解决此问题?最简单的方法是在此处放弃指针,而是通过非常量引用传递结构。代码如下所示:

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;
}