Rust Dangling Pointer

2023. 2. 25. 17:18Language/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