작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
763
0
한가지 에러는 WRITE_LOCK 부분인데요
void MemoryPool::Push(MemoryHeader* ptr)
{
WRITE_LOCK;
//Pool에 메모리 반납
queue.push(ptr);
allocCount.fetch_sub(1);
}
부분에서 WRITE_LOCK에서 에러가 나고 있는 상황입니다.
Push와 Pop 둘 다 동일합니다.
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
오류(활성) E0300 바인딩된 함수에 대한 포인터는 함수를 호출하는 데에만 사용할 수 있습니다.
이런 에러가 나고 있는 상황이고
한가지 질문은 Memory부분에서
if (allocSize > MAX_ALLOC_SIZE)
{
header = reinterpret_cast<MemoryHeader*>(malloc(allocSize));
}
부분에서 왜 static_cast를 쓰지 않고 reinterpret_cast를 사용하는 건가요? static_cast를 사용했을 때 발생할 수 있는 문제점이 있나요?
답변 1
0
음 에러라는게 빌드 에러를 말씀하시는건가요? 강의 코드를 그대로 받아서 실행해도 동일한가요?
4대 캐스팅 관련된 내용은 서버 시간에 다룰 부분이 아닙니다.
따로 구글링을 통해 차이에 대해 알아보시기 바랍니다.
캐스팅 4총사는 용도에 따라 사용할 수 있는 상황이 조금 다르기도 하고
또 사용 여부에 따라 프로그래머의 의도를 나타낼 수도 있다는 장점이 있는데요.
가령 dynamic_cast를 사용하지 않고서도 static_cast로 포인터 변환을 하더라도,
타입만 확실하다면 문제 없이 지나갈 수 있습니다. (먼저 타입 체크를 하고 static_cast를 하는 등)
포인터 변환에서의 reinterpret_cast와 static_cast는
전자의 경우 아무런 연관성 없는 포인터의 변환을,
후자는 상속 구조에서의 강제 포인터 변환에 사용하는데 (dynamic처럼 체크는 X)
물론 지금의 경우 malloc이 void*을 뱉어주니 결과적으로 둘 중 뭘 사용하더라도 상관없습니다.
다만 reinterpret_cast가 조금 더 '상관없는 포인터 타입으로의 변환'의 의미를 내포하고 있을 뿐이죠.
이런 세부적인 부분은 그냥 원하는 방식으로 만드시면 됩니다.
왜 reinterpret_cast를 쓰는지 여쭤본건 캐스팅의 차이점을 묻는다기 보단
reinterpret_cast를 쓰는 특별한 이유가 있는지, 다른 캐스팅을 쓰면 프로그램의 진행에 문제가 있는지를 여쭤보고 싶어서였습니다.
혹시 그 이유가 캐스팅의 차이점과 관련이 있는건가요?