C++; 我编写了一些代码,涉及C++中的变量的移动和更改。下面是我写的 #include <iostream> void six(int*& ptr) { int s = 6; ptr = &s; } int main() { int f = 5; int* ptr = &f; std::cout << *ptr << '\n'; six(ptr); if (ptr) { std::cout << *ptr; } else { std::cout << "null\n"; } return 0; }

C++; 我编写了一些代码,涉及C++中的变量的移动和更改。下面是我写的 #include <iostream> void six(int*& ptr) { int s = 6; ptr = &s; } int main() { int f = 5; int* ptr = &f; std::cout << *ptr << '\n'; six(ptr); if (ptr) { std::cout << *ptr; } else { std::cout << "null\n"; } return 0; },c++,memory,C++,Memory,我尝试了另一个代码,添加了一行: #include <iostream> void six(int*& ptr) { int s = 6; ptr = &s; free(&s); // added line } int main() { int f = 5; int* ptr = &f; std::cout << *ptr << '\n'; six(ptr);

我尝试了另一个代码,添加了一行:

#include <iostream>

void six(int*& ptr) {
    int s = 6;
    ptr = &s;
    free(&s); // added line
}

int main() {
    int f = 5;
    int* ptr = &f;

    std::cout << *ptr << '\n';
    six(ptr);

    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }

    return 0;
}
#包括
空六(内部*&ptr){
int s=6;
ptr=&s;
空闲(&s);//添加了行
}
int main(){
int f=5;
int*ptr=&f;

std::cout第一种情况不是内存泄漏,而是未定义的行为,因为变量超出范围

在这种情况下,您不知道何时清理(替换)或重新分配内存


因此,在某些情况下,结果可能是正确的,但这纯粹是运气的问题。

第一种情况不是内存泄漏,而是未定义的行为,因为变量超出了范围

在这种情况下,您不知道何时清理(替换)或重新分配内存


因此,在某些情况下,结果可能是正确的,但这纯粹是运气的问题。

第一个代码并不总是这样。这是未定义的行为。请参阅。您也不能释放自动变量。
free(&s);
不存在。@openingnow感谢您的评论,但我不是说代码是否正确。两者在编译时都没有问题。它确实会编译,但会导致错误。@openingnow是的,我已经写过它会产生错误。我好奇的是第一种情况的行为。它的内存中可以有六个,即not保证。如果使用
-O3
标志在处运行第一个代码,则值会更改。第一个代码并不总是这样。这是未定义的行为。请参阅。此外,您不能释放自动变量。
释放(&s);
不存在。@openingnow感谢您的评论,但我不是说代码是否正确。两者在编译时都没有问题。它确实会编译,但会导致错误。@openingnow是的,我已经写过它会产生错误。我好奇的是第一种情况的行为。它的内存中可以有六个,即not保证。如果使用
-O3
标志在处运行第一个代码,则值会更改。
#include <iostream>

void six(int*& ptr) {
    int s = 6;
    ptr = &s;
    free(&s); // added line
}

int main() {
    int f = 5;
    int* ptr = &f;

    std::cout << *ptr << '\n';
    six(ptr);

    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }

    return 0;
}