Rust Dangling Pointer
2023. 2. 25. 17:18ㆍLanguage/Rust
개요
Rust에서는 Dangling Pointer가 발생하는 것을 컴파일러 단계에서 막을 수 있습니다.
Rust에서 어떻게 Dangling Pointer를 막는지 알아봅니다.
Dangling Pointer란?
해제 된 메모리 영역을 가리키고 있는 포인터를 Dangling Pointer라고 합니다.
아래 같은 코드가 있습니다.
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int *b = &a;
int *c = &a;
cout << a << endl;
cout << *b << endl;
cout << *c << endl;
}
여기서 B가 메모리를 해제하게 되면 A의 메모리가 해제 되게 됩니다.
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int *b = &a;
int *c = &a;
cout << a << endl;
cout << *b << endl;
delete b;
cout << *c << endl;
}
여기서 C가 Dangling Pointer가 되는데 해제 된 메모리를 가리키고 있기 때문에 에러가 나게 됩니다.
C나 C++의 경우에는 런타임에서 이를 확인 할 수 있습니다.
Rust vs. C++
아래의 예제는 c++로 짠 예제입니다.
string* dangle()
{
string* s = new string();
return s;
}
int main()
{
string* reference_to_nothing = dangle();
cout << *reference_to_nothing << endl;
}
C++에서는 reference_to_nothing에 값이 없다는 것을 런타임 때 알 수 있습니다.
Rust는 언어에서 이와 같은 Dangling Pointer를 만들 수가 없습니다. 컴파일러에서 걸러지게 됩니다.
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
위 코드의 오류 메시지 입니다.
error[E0106]: missing lifetime specifier
--> dangle.rs:5:16
|
5 | fn dangle() -> &String {
| ^^^^^^^
|
= help: this function's return type contains a borrowed value, but there is no
value for it to be borrowed from
= help: consider giving it a 'static lifetime
error: aborting due to previous error
s가 dangle안에서 만들어졌기 때문에, dangle의 코드가 끝이나면 s는 할당 해제됩니다. 하지만 우리는 이것의 참조자를 반환하려고 했습니다. 이는 곧 이 참조자가 어떤 무효화된 String을 가리키게 될 것이란 뜻이 아닙니까! 별로 안 좋죠. 러스트는 우리가 이런 짓을 못하게 합니다.
'Language > Rust' 카테고리의 다른 글
Rust로 폴더 감시자 만들기 (0) | 2023.03.05 |
---|---|
Rust 마스코트로 콘솔 메시지 출력 (1) | 2023.03.05 |
Rust의 배열 (0) | 2023.01.09 |
Rust의 제네릭(Generic) (0) | 2023.01.09 |
Rust의 반복문 (0) | 2023.01.08 |