본문 바로가기
다양한 TIP

std::move(tmp) 사용 후 tmp가 사라지면 문제가 없을까?

by 유기농프로그래밍 2025. 3. 7.
반응형

std::move(tmp) 사용 후 tmp가 사라지면 문제가 없을까?

👉 결론: 전혀 문제없음!

 

이유는 std::move(tmp)를 통해 set.insert()가 tmp의 데이터를 이동하여 저장하기 때문!

 

1️⃣ std::move(tmp)가 실제로 하는 일

std::move(tmp)를 하면 tmp의 내부 버퍼(포인터)를 set이 소유하게 되고, tmp는 비어있는 상태가 됨.
즉, set.insert(std::move(tmp))을 하면 다음이 일어남:

  1. std::move(tmp)가 tmp를 우측값(rvalue)으로 변환
  2. std::string의 이동 생성자(move constructor)가 호출됨
  3. set 내부의 노드가 tmp의 문자열 버퍼를 가져감
  4. 이후 tmp는 비어 있는 상태가 됨 (길이 0, 메모리 해제되거나 재사용)

즉, set이 tmp의 데이터를 가져가므로 tmp가 사라져도 문제 없음! 🚀

 

2️⃣ 루프를 벗어나면 tmp가 없어지는데도 괜찮은 이유

🔹 예제 코드

#include <iostream>
#include <set>
#include <string>

int main() {
    std::set<std::string> mySet;

    for (int i = 0; i < 3; i++) {
        std::string tmp = "Hello World " + std::to_string(i);
        mySet.insert(std::move(tmp));  // tmp의 데이터가 이동됨
        std::cout << "After move, tmp: " << tmp << std::endl;  // tmp는 비어있음
    }

    std::cout << "Set contents:\n";
    for (const auto& s : mySet) {
        std::cout << s << std::endl;  // 데이터가 잘 저장됨
    }

    return 0;
}

 

 

🔹 실행 결과

After move, tmp: 
After move, tmp: 
After move, tmp: 
Set contents:
Hello World 0
Hello World 1
Hello World 2

 

set이 데이터를 잘 저장했지만, tmp는 move 후 비어 있음!

👉 즉, 루프를 벗어나서 tmp가 삭제되어도 set에는 정상적으로 남아 있음.

 

3️⃣ std::move(tmp)와 set.insert(tmp) 차이

방식 동작 결과
set.insert(tmp) tmp의 데이터를 새로 복사하여 set에 저장 느림 (O(N))
set.insert(std::move(tmp)) tmp의 내부 버퍼를 그대로 이동하여 set에 저장 빠름 (O(1))

 

👉 tmp가 소멸해도 set이 데이터를 안전하게 보관하므로 문제 없음! 🚀

 

4️⃣ 최종 결론

std::move(tmp)는 단순히 포인터를 이동시키는 역할이므로, tmp가 루프 종료 후 삭제되어도 set 내부 데이터에는 영향 없음!

반대로, std::move를 사용하지 않으면 tmp가 복사되므로 성능이 저하됨.

즉, std::move(tmp)를 사용해도 set에 안전하게 저장됨. 🚀

반응형

댓글