Created
May 11, 2018 03:26
-
-
Save fortheday/ee3bd69a5e28f32bd13af7e3057da472 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma warning(disable : 4710 4514) | |
#include <vector> | |
#include <functional> | |
struct SMemHolder | |
{ | |
char *m_pBuf; | |
SMemHolder() : m_pBuf(nullptr) | |
{ | |
puts("ctor"); | |
} | |
SMemHolder(int) : m_pBuf(new char[8]) | |
{ | |
puts("ctor+alloc"); | |
} | |
SMemHolder(const SMemHolder &rRight) | |
{ | |
if (rRight.m_pBuf != nullptr) | |
{ | |
puts("copy-ctor+alloc&memcpy"); | |
m_pBuf = new char[8]; | |
memcpy(m_pBuf, rRight.m_pBuf, 8); | |
} | |
else | |
{ | |
puts("copy-ctor"); | |
m_pBuf = nullptr; | |
} | |
} | |
#define USE_MOVE_CTOR_DEFAULT 0 | |
#if !USE_MOVE_CTOR_DEFAULT | |
// Move & Clear | |
SMemHolder(SMemHolder &&rvRightBeMoved) | |
{ | |
puts("move-ctor, nullize m_pBuf"); | |
m_pBuf = rvRightBeMoved.m_pBuf; | |
rvRightBeMoved.m_pBuf = nullptr; | |
} | |
#else | |
// Just Move, No Clear | |
SMemHolder(SMemHolder &&rvRightBeMoved) = default; | |
// 위 코드는 아래와 같다. | |
// 생 포인터 멤버의 메모리를 직접 할당/해제할 경우 =default 이동생성자를 사용하지 않아야 한다. | |
//SMemHolder(SMemHolder &&rvRightBeMoved) | |
//{ | |
// m_pBuf = move(rvRightBeMoved.m_pBuf); | |
// //rvRightBeMoved.m_pBuf = nullptr; 이 없다. | |
//} | |
#endif | |
~SMemHolder() | |
{ | |
if (m_pBuf != nullptr) | |
{ | |
puts("dtor, delete"); | |
delete[] m_pBuf; | |
} | |
else | |
puts("dtor, no delete"); | |
} | |
}; | |
struct SHolderHolder | |
{ | |
SMemHolder m_MemHolder; | |
SHolderHolder() : m_MemHolder(8) {} | |
SHolderHolder(const SHolderHolder &) = default; | |
SHolderHolder(SHolderHolder &&rvRightBeMoved) = default; // 이런 용법에서 =default 이동생성자는 의미가 있다. | |
}; | |
void TestMoveCtor() | |
{ | |
puts("--- Test MemHolder"); | |
{ | |
SMemHolder holderA(8); | |
SMemHolder holderB(holderA); // copy | |
SMemHolder holderC(std::move(holderB)); // move | |
// USE_MOVE_CTOR_DEFAULT 1 일 때 C가 파괴되고, B를 파괴할 때 예외발생. | |
} | |
puts("--- Test Holder's holder"); | |
{ | |
SHolderHolder holderHolderA; | |
SHolderHolder holderHolderB(holderHolderA); // copy | |
SHolderHolder holderHolderC(std::move(holderHolderB)); // move | |
// USE_MOVE_CTOR_DEFAULT 1 일 때 C가 파괴되고, B를 파괴할 때 예외발생. | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment