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