cpp_unique_pointer - 8BitsCoding/RobotMentor GitHub Wiki

cpp_unique_pointer

๊ธฐ์ค€ํฌ์ธํ„ฐ์˜ ๋ฌธ์ œ์ 

  • ๋” ์ด์ƒ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผํ•œ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค -> ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ


unique_ptr์ด๋ž€?

#include <memory>
#include "Vector.h"

int main() {
    std::unique_ptr<Vector> myVector(new Vector(10.f, 30.f));
    // ํฌ์ธํ„ฐ ๋ถ€ํ˜ธ(*)๊ฐ€ ์—†์Œ

    myVector->Print();
    // ํฌ์ธํ„ฐ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ

    // delete๊ฐ€ ์—†์Œ

    return 0;
}
  • ํฌ์ธํ„ฐ(๊ธฐ์กด์— ์“ฐ๋˜)๋ฅผ ๋‹จ๋…์œผ๋กœ ์†Œ์œ ํ•œ๋‹ค.
  • ์›์‹œ ํฌ์ธํ„ฐ๋Š” ๋ˆ„๊ตฌํ•˜๊ณ ๋„ ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ณต์‚ฌ๋‚˜ ๋Œ€์ž…์ด ๋ถˆ๊ฐ€๋Šฅ!
  • unique_ptr์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ์›์‹œ ํฌ์ธํ„ฐ๋Š” ์ง€์›Œ(delete)์ง„๋‹ค.
std::unique_ptr<Vector> myVector(new Vector(10.f, 30.f));

std::unique_ptr<Vector> copiedVector1 = myVector;       // Error
std::unique_ptr<Vector> copiedVector2(myVector);        // Error

์–ด๋””์— ์“ฐ๋‚˜??

ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž

class Player
{
private:
    Vector* mLocation;
};

Player::Player(std::string name) :
    mLocation(new Vector())
{
}

Player::~Player(){
    // ๋งค๋ฒˆ ์ ์–ด์ค˜์•ผํ•จ.
    delete mLocation;
}
class Player
{
private:
    std::unique<Vector> mLocation;
};

Player::Player(std::string name) :
    mLocation(new Vector())
{
}

// delete์ƒ๋žต ๊ฐ€๋Šฅ!

(์—„์ฒญ ํฐ) ์ง€์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ

int main() {
    Vector* vector = new Vector(10.f, 30.f);

    delete vector;

    return 0;
}
int main() {
    std::unique_ptr<Vector> myVector(new Vector(10.f, 30.f));

    return 0;
}

STL ๋ฒกํ„ฐ์— ํฌ์ธํ„ฐ ์ €์žฅ

#include <vector>

int main() {
    std::vector<Player*> players;

    players.push_back(new Player("Lulu"));
    players.push_back(new Player("Coco"));

    for(int i = 0; i < players.size(); ++i)
    {
        delete players[i];
    }

    players.clear();
}
#include <vector>

int main() {
    std::vector<std::unique_ptr<Player>> playerList;

    playerList.push_back(std::unique_ptr<Player>(new Player("Lulu")));
    playerList.push_back(std::unique_ptr<Player>(new Player("Coco")));

    playerList.clear();
}

reset()

์„ ์–ธํ•œ ํฌ์ธํ„ฐ๋ฅผ resetํ•˜๊ณ  ์‹ถ๋‹ค

int main() {
    std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);

    vector.reset(new Vector(20.f, 40.f));
    vector.reset(); // nullptr
}

nullptr์ด ๊ฐ€๋…์„ฑ์ด ๋†’๊ธฐ์— vector = nullptr์“ธ ๊ฒƒ.


get() : ์›์‹œํฌ์ธํ„ฐ ์ „๋‹ฌ

void Vector::Add(const Vector* other)
{
    //
}

// main
std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);
std::unique_ptr<Vector> anotherVector = std::make_unique<Vector>(20.f, 40.f);

vector->Add(anotherVector.get());

release() : ์›์‹œํฌ์ดํ„ฐ ์ „๋‹ฌ ํ›„ ์Šค๋งˆํŠธํฌ์ธํ„ฐ ์‚ญ์ œ

// main
std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);
Vector* vectorPtr = vector.release();

์‚ฌ์‹ค ์“ธ ์ผ์ด ๊ทธ๋ฆฌ ์—†์Œ!


ํฌ์ธํ„ฐ ์†Œ์œ ๊ถŒ ์˜ฎ๊ธฐ๊ธฐ

#include <memory>
#include "Vector.h"

int main() {
    std::unique_ptr<Vector> vector = std::make_unique<Vecor>(10.f, 30.f);
    std::unique_ptr<Vector> anotherVector(std::move(vector));
}
  • ๊ฐœ์ฒด A์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ๊ทธ ์†Œ์œ ๊ถŒ์„ B์—๊ฒŒ ์ฃผ๋Š” ๋ฐฉ๋ฒ•
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ฒŒ, A์— ์žˆ๋Š” ๋ชจ๋“  ํฌ์ธํ„ฐ๋ฅผ B์— ๋Œ€์ž…ํ•˜๊ณ  A์—๋Š” nullptr์„ ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐ
  • r-value์™€ move์ƒ์„ฑ์ž๋ฅผ ๋ฐฐ์šฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด์ œ ๋ชจ๋‘ unique_ptr์„ ์‚ฌ์šฉ
  • ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๋งŒํผ ๋น ๋ฅด๋‹ค.
  • RAII์›์น™์— ์ž˜ ๋“ค์–ด๋งž์Œ
    • ์ž์› ํ• ๋‹น์€ ๊ฐœ์ฑ„์˜ ์ˆ˜๋ช…๊ณผ ์—ฐ๊ด€
    • ์ƒ์„ฑ์ž์—์„œ new, ์†Œ๋ฉธ์ž์—์„œ delete
  • ์‹ค์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์›€
  • ๋ชจ๋“ ๊ณณ์— ์“ฐ์ž!

Sample

// ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•๊นŒ์ง€๋„ ์œ ๋‹ˆํฌ ํฌ์ธํ„ฐ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
unique_ptr<int> num1 = make_unique<int>(10);
uniquq_ptr<char> char1 = make_unique<char>('d');

cout << *num1 << endl;
cout << *char1 << endl;

// ๊ฐœ์ฒด๋กœ unique ptr
unique_ptr<MyVector> myVector = make_unique<MyVector>(3, 5);

cout << "X : " << myVector->GetX() << ", Y :" << myVector->GetY() << endl;

// ์†Œ์œ ๊ถŒ ์ด์ „
unique_ptr<char> char2(move(char1));
//cout << "char1 :" << *char1 << endl;        // Error
cout << "char2 :" << *char2 << endl;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ