Skip to content

Instantly share code, notes, and snippets.

@fortheday
Created May 11, 2018 03:26
Show Gist options
  • Save fortheday/ee3bd69a5e28f32bd13af7e3057da472 to your computer and use it in GitHub Desktop.
Save fortheday/ee3bd69a5e28f32bd13af7e3057da472 to your computer and use it in GitHub Desktop.
#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