Program Language/C & C++

[C++] std::bind 시 변수 메모리 유지 불가

야곰야곰+책벌레 2021. 12. 2. 10:52
728x90
반응형

  function을 구성할 때 운용하기 쉽도록 하기 위해 bind를 이용하여 매개변수를 미리 넣어둘 수 있다. 하지만 이 방향은 하나의 패키지처럼 묶기기 때문인지 변수의 메모리 주소가 변경되었다.

아래와 같이 간단히 테스트해보면 bind로 묶은 변수 b와 실제 함수에 적용되는 b의 주소 값이 다르다. 결과도 적용되지 않는다.

#include <iostream>
#include <functional>
using namespace std;

void add(int a, int& b)
{
	b = a * a;
	cout << "b address : " << &b << endl;
}

int main()
{
	std::function<void(int, int&)> func = add;

	int a = 10;
	int b = 1;
	auto newFunc = std::bind(func, a, b);

	cout << "b address : " << &b << endl;
	newFunc();
	cout << "b result : " << b << endl;

	return 0;
}

b의 주소가 다를 뿐 아니라 결과 값도 변경되지 않았다. 이것은 변수를 참조자(&)를 사용했기 때문이다.

내부적으로 어떤 처리를 하는지 확인할 수 없지만 해당 부분을 포인트로 변경하면 제대로 동작한다.

#include <iostream>
#include <functional>
using namespace std;

void add(int a, int* b)
{
	*b = a * a;
	cout << "b address : " << b << endl;
}

int main()
{
	std::function<void(int, int*)> func = add;

	int a = 10;
	int b = 1;
	auto newFunc = std::bind(func, a, &b);
	
	cout << "b address : " << &b << endl;
	newFunc();
	cout << "b result : " << b << endl;

	return 0;
}

포인트를 줄이고 참조자를 많이 이용하려고 했던 습관이 이런 결과를 가져올지 몰랐다.

bind한 변수를 참조자를 이용하여 컨트롤하려고 했는데 되지 않았다면, 포인터를 이용하면 해결할 수 있다.

728x90
반응형