Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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++_Pointers - Fatal编程技术网

C++ 如何防止函数释放局部变量的内存?

C++ 如何防止函数释放局部变量的内存?,c++,pointers,C++,Pointers,我试图通过存储函数的地址来保存函数中的局部变量。但是,编译器似乎会自动释放该变量的内存,即使在我将其地址存储到指针变量中之后也是如此 我所处的情况(与下面的代码不同)是,我必须让类的成员变量存储函数中声明的变量的地址 #include <stdio.h> static int* p; void foo(){ int a = 5; p = &a; } int main(){ foo(); //some delay printf(

我试图通过存储函数的地址来保存函数中的局部变量。但是,编译器似乎会自动释放该变量的内存,即使在我将其地址存储到指针变量中之后也是如此

我所处的情况(与下面的代码不同)是,我必须让类的成员变量存储函数中声明的变量的地址

#include <stdio.h>

static int* p;

void foo(){
    int a = 5;
    p = &a;
}

int main(){
    foo();

    //some delay

    printf("*p = %d\n",*p);
}
#包括
静态int*p;
void foo(){
INTA=5;
p=&a;
}
int main(){
foo();
//耽搁
printf(“*p=%d\n”,*p);
}

理想情况下,
*p
应该是5,但它最终不是5,并且在我重新运行脚本时,它与5有很大不同。我相信
foo
中分配给
a
的内存正在自动释放。如何确保
*p
在任何延迟情况下都是5?

使用自动存储变量的目的是当它们超出范围时消失。 在它们被破坏后指向它们是未定义的行为。UB可能会返回正确的值,错误的值,或者使你的应用程序崩溃,或者诸如此类

如果你想保留它,不要让它成为本地的。使用(并返回)一个
唯一的\u ptr
/
共享的\u ptr
(尽管我不明白您为什么要在代码中这样做)


所有建议使用静态变量的答案都是错误的。虽然它会暂时工作,但如果你养成习惯,它肯定会产生许多其他问题。

如果你想在函数调用后保持
foo
中的变量,那么你必须将
a
设置为静态变量。C++是一个基于栈的机器:这意味着变量的生存期限制在它的范围内。在您的示例中,
a
被限制在
foo
的范围内。如果将变量设置为静态,则会将变量的生存期延长到顶级范围,但会限制对函数中
a
的访问

#include <stdio.h>

static int* p;

void foo(){
    int a = 5;
    p = &a;
}

int main(){
    foo();

    //some delay

    printf("*p = %d\n",*p);
}
我觉得您试图做的代码非常难闻,但以下是您所要求的:

#include <stdio.h>

static int* p;

void foo(){
    static int a = 5; // a will only be initialized to 5 once (see magic statics)
    p = &a;
}

int main(){
    foo();

    //some delay

    printf("*p = %d\n", *p);
}
#包括
静态int*p;
void foo(){
static int a=5;//a将只初始化为5一次(请参阅magic statics)
p=&a;
}
int main(){
foo();
//耽搁
printf(“*p=%d\n”,*p);
}
在此示例中,您可以保证
a
将在第一次调用时初始化,并且在程序结束之前不会被重用或删除。

解决方案1-使用new和delete动态内存分配 如果希望在函数退出后可以访问内存位置,则应使用
new
动态分配它:

int* foo() {
    int* p = new int(5); // Get pointer to int with value of 5
    return p; 
}
由于该指针已分配了
new
,因此它将一直保留,直到您对其调用
delete

int main() {
    int* myPtr = foo(); 

    // Do stuff with myPtr

    delete myPtr; // Free it, now that it's no longer needed.
}
潜在问题 当人们谈论在C++中必须做手动内存管理时,这通常是他们的意思。确定何时调用对象上的
delete
可能很棘手,而且很容易把事情搞砸

解决方案2-变量
a
即使在函数退出后仍然存在,并且每次调用函数时都是相同的
a
如果我们将
a
标记为static,那么每次调用函数时,它都将具有相同的内存地址,并且不会被释放:

int* p;
void foo() {
    static int a = 5;

    p = a;
}

int main() {
    foo(); 

    // stuff...

    std::cout << *p << '\n'; // Prints 5, unless you modified *p
}
int*p;
void foo(){
静态int a=5;
p=a;
}
int main(){
foo();
//东西。。。

std::cout使用一个静态变量,它将解决5的问题。
另一方面,由于内存是一个局部变量,因此无法保存它。

您认为为什么要这样做?您不能。获取一个局部变量的地址并在其定义的范围之外取消对其的引用是UB。请参阅。通过web搜索找到的教程。Internet上到处都是糟糕的教程,有些糟糕到让您无法阅读阅读它们会让你成为一个更糟糕的程序员。除非你对语言有足够的了解,能够分辨好坏,否则你将任由骗子和胡说八道的白痴摆布。如果你仍然对教程感兴趣,请咨询公认的领域专家,并使用他们的教程或他们推荐的教程。除非你愿意,否则不要推荐教程如果我在C++类的函数中编写<代码> <代码>静态,它是否是全局变量、成员变量,还是只能在该函数内访问?@ Alxb可以将它视为一个全局变量,该变量只能在该函数内访问。但是将
&a
存储到另一个指针中,这会破坏我原来的指针吗?@AlexB不会。它只是意味着你有多个可以更改数据的点。请注意,这意味着非常不同。两者的含义都不同。我试着让函数也返回
a
,但保留returned变量未使用。这会解决问题吗?智能指针。它们将在不再需要时自动销毁。永远不要再进行新建/删除。@MichaelChourdakis当然,将全局指针绑定到静态变量是错误的。不过,问题明确地问到如何在函数执行后保留指针数据。这只是因为stion是“坏”并不能准确回答这个问题。在你看来,什么是可行的和更聪明的?@AlexB不要太聪明。你将无法调试它。让编译器变得聪明,然后用分析器测试它的聪明度。如果发现它不够聪明,用最坏的部分再聪明一点。