์ด์ ์ฅ์์ ๋ณธ ํ๋ก๊ทธ๋จ์์๋ ํ์ํ ๋ณ์๋ฅผ ์ ์ํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ ์ฌํญ์ ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ ์ฌํญ์ด ๋ฐํ์ ์ค์๋ง ๊ฒฐ์ ๋ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด C++ ์ธ์ด๋ ์ฐ์ฐ์ new๋ฐ delete.
์๋ก์ด ์ฐ์ฐ์์ ์๋ก์ด ์ฐ์ฐ์[]
๋์ ๋ฉ๋ชจ๋ฆฌ๋ operator ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น๋ฉ๋๋ค new. new๋ค์์ ๋ฐ์ดํฐ ์ ํ ์ง์ ์๊ฐ ์ค๊ณ , ๋ ์ด์์ ์์ ์ํ์ค๊ฐ โโํ์ํ ๊ฒฝ์ฐ ๋๊ดํธ ์์ ์ด๋ฌํ ์์์ ์๊ฐ ์ต๋๋ค []. ํ ๋น๋ ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์์ ๋ถ๋ถ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค . ์ฒซ ๋ฒ์งธ ํํ์์ type ์ ๋จ์ผ ์์๋ฅผ ํฌํจํ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค . ๋ ๋ฒ์งธ ๊ฒ์ ์ ํ ์์์ ๋ธ๋ก(๋ฐฐ์ด)์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ , ์ฌ๊ธฐ์ ๋ ์ด๋ฌํ ์์์ ์์ ๋ํ๋ด๋ ์ ์ ๊ฐ์
๋๋ค. ์๋ฅผ ๋ค์ด:
pointer = new type
pointer = new type [number_of_elements]
typetypenumber_of_elements
int * foo;
foo = new int [5];
์ด ๊ฒฝ์ฐ ์์คํ
์ 5๊ฐ์ ์ ํ ์์์ ๋ํ ๊ณต๊ฐ์ ๋์ ์ผ๋ก ํ ๋น intํ๊ณ (ํฌ์ธํฐ)์ ํ ๋น๋ ์ํ์ค์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค foo. ๋ฐ๋ผ์ foo์ด์ type ์ 5๊ฐ ์์์ ๋ํ ๊ณต๊ฐ์ด ์๋ ์ ํจํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ฐ๋ฆฌํต๋๋ค int.
์ฌ๊ธฐ์ foo๋ ํฌ์ธํฐ์ด๋ฏ๋ก ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฒซ ๋ฒ์งธ ์์๋ ํํ์ ์ด๋ fooํํ์์ผ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค (๋ ๋ค ๋์ผํจ). ๋ ๋ฒ์งธ ์์๋ ๋๋ ๋ฑ์ ์ฌ์ฉํ์ฌ ์ก์ธ์คํ ์ ์์ต๋๋ค . ์ผ๋ฐ ๋ฐฐ์ด์ ์ ์ธํ๋ ๊ฒ๊ณผ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ฒ ์ฌ์ด์๋ ์๋นํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.foo[0]*foofoo[1]*(foo+1)
new. ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ ์ผ๋ฐ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ์์ ํํ์ ์ด์ด์ผ ํ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๋ ์๊ฐ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๊ณ ์คํํ๊ธฐ ์ ์ ์ ์ํด ์ํ๋๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ newํ ๋นํ ์ ์๋ค๋ ๊ฒ ์
๋๋ค. ์์์ ๋ณ์ ๊ฐ์ ํฌ๊ธฐ๋ก ์ฌ์ฉํ์ฌ ๋ฐํ์ ๋์ ๋ฉ๋ชจ๋ฆฌ.
์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์์ ์์ฒญํ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ ์์คํ
์ด ๋ฉ๋ชจ๋ฆฌ ํ์์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํ๋ ๋ฆฌ์์ค์ด๋ฉฐ ๊ณ ๊ฐ๋ ์ ์์ต๋๋ค. new๋ฐ๋ผ์ ์ฐ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๋ ๋ชจ๋ ์์ฒญ์ด ์์คํ
์์ ์น์ธ ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค .
C++๋ ํ ๋น์ด ์ฑ๊ณตํ๋์ง ํ์ธํ๋ ๋ ๊ฐ์ง ํ์ค ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
ํ๋๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. bad_alloc์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉ ํ๋ฉด ํ ๋น์ด ์คํจํ๋ฉด type ์์ธ ๊ฐ throw๋ฉ๋๋ค. ์์ธ๋ ์ด ์์ต์์ ๋ท๋ถ๋ถ์์ ์ค๋ช
ํ๋ ๊ฐ๋ ฅํ C++ ๊ธฐ๋ฅ์
๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ์ด ์์ธ๊ฐ ๋ฐ์ํ๊ณ ํน์ ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ด ์ข
๋ฃ๋๋ค๋ ๊ฒ์ ์์์ผ ํฉ๋๋ค.
์ด ์์ธ ๋ฉ์๋๋ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฉ์๋์ด๋ฉฐ ๋ค์ new๊ณผ ๊ฐ์ ์ ์ธ์ ์ฌ์ฉ๋ฉ๋๋ค.
foo = new int [5]; // if allocation fails, an exception is thrown
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ ์ด ๋ฐฉ๋ฒ nothrow์ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์คํจํ๋ฉด bad_alloc์์ธ๋ฅผ throwํ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ ๋์ ์์ ๋ฐํํ ํฌ์ธํฐ new๊ฐ null ํฌ์ธํฐ ์ด๊ณ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ๊ณ์ ์คํ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ํค๋์ ์ ์ธ๋
์ด๋ผ๋ ํน์ ๊ฐ์ฒด ๋ฅผ ๋ค์ ์ ๋ํ ์ธ์๋ก ์ฌ์ฉํ์ฌ ์ง์ ํ ์ ์์ต๋๋ค .nothrow<new>new
foo = new (nothrow) int [5];
์ด ๊ฒฝ์ฐ ์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ํ ๋น์ด ์คํจํ๋ฉด foo๊ฐ null ํฌ์ธํฐ์ธ์ง ํ์ธํ์ฌ ์คํจ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
int * foo;
foo = new (nothrow) int [5];
if (foo == nullptr) {
// error assigning memory. Take measures.
}
์ด nothrow๋ฐฉ๋ฒ์ ๋ชจ๋ ํ ๋น ํ์ ๋ฐํ๋ ํฌ์ธํฐ ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ์ธํ๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ์์ธ๋ณด๋ค ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ด๋ ์ค์ํ ํ ๋น์ ๋ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ์์ธ ๋ฉ์ปค๋์ฆ์ด ์ ํธ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ์์ ์ ๋๋ถ๋ถ์ nothrow๋จ์์ฑ ๋๋ฌธ์ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์ฐ์ฐ์ ์ญ์ ๋ฐ ์ญ์ []
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก๊ทธ๋จ ๋ด์ ํน์ ๊ธฐ๊ฐ ๋์์๋ง ํ์ํฉ๋๋ค. ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ์์ฒญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด operator ์ ๋ชฉ์ ์ ๋๋ค delete. ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
delete pointer;
delete[] pointer;
์ฒซ ๋ฒ์งธ ๋ช
๋ น๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น๋ ๋จ์ผ ์์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ๋ ๋ฒ์งธ ๋ช
๋ น๋ฌธ new์ ๋๊ดํธ( ) ์์ new ๋ฐ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฐฐ์ด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค [].
์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ delete์ด์ ์ ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ new์ด๊ฑฐ๋ ๋ ํฌ์ธํฐ (๋ ํฌ์ธํฐ์ ๊ฒฝ์ฐ ํจ๊ณผ ๊ฐ delete์์)์ฌ์ผ ํฉ๋๋ค.
// rememb-o-matic
#include <iostream>
#include <new>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "How many numbers would you like to type? ";
cin >> i;
p= new (nothrow) int[i];
if (p == nullptr)
cout << "Error: memory could not be allocated";
else
{
for (n=0; n<i; n++)
{
cout << "Enter number: ";
cin >> p[n];
}
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << p[n] << ", ";
delete[] p;
}
return 0;
}
์ ๋ช ๋ น๋ฌธ์์ ๋๊ดํธ ์์ ๊ฐ์ด i์์ ํํ์์ด ์๋๋ผ ์ฌ์ฉ์( ) ๊ฐ ์ ๋ ฅํ ๋ณ์ ๊ฐ์์ ์ฃผ๋ชฉํ์ญ์์ค.
p= new (nothrow) int[i];
i์ฌ์ฉ์๊ฐ ๋๋ฌด ํฐ ๊ฐ์ ์
๋ ฅํ์ฌ ์์คํ
์ด ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ ๊ฐ๋ฅ์ฑ์ด ํญ์ ์กด์ฌํฉ๋๋ค . ์๋ฅผ ๋ค์ด "๋ช ๊ฐ"๋ผ๋ ์ง๋ฌธ์ 10์ต์ด๋ผ๋ ๊ฐ์ ์ฃผ๋ ค๊ณ ํ์ ๋ ๋ด ์์คํ
์ ํ๋ก๊ทธ๋จ์ ๊ทธ๋ ๊ฒ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์๊ณ ์ด ๊ฒฝ์ฐ๋ฅผ ์ํด ์ค๋นํ ๋ฌธ์ ๋ฉ์์ง( Error: memory could not be allocated)๋ฅผ ๋ฐ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ํฌ์ธํฐ ๊ฐ(if )์ ํ์ธํ๊ฑฐ๋ ์ ์ ํ ์์ธ๋ฅผ catchํ์ฌ
๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ๋ฅผ ํญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค .nothrow
C์ ๋์ ๋ฉ๋ชจ๋ฆฌ
C++๋ ์ฐ์ฐ์ new๋ฅผ ํตํฉํ๊ณ delete๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ C ์ธ์ด์์๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ๋์ ํค๋์ ์ ์๋ ํจ์ malloc, ๋ฐ calloc, ( C ๋ก ์๋ ค์ง ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ฃจ์ ์ ์ฌ์ฉํ์ต๋๋ค. ํจ์๋ C++์์๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ ํ ๋น ํด์ ํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํจ์์ ์ํด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ ์ํด ๋ฐํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก๊ณผ ๋ฐ๋์ โโํธํ๋๋ ๊ฒ์ ์๋๋ฏ๋ก ํผํฉํด์๋ ์ ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ๊ณ ์ ํ ํจ์ ๋๋ ์ฐ์ฐ์ ์งํฉ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.reallocfree<cstdlib><stdlib.h>
'๐ Development Study > ๐จ๐พโ๐ป C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ธฐํ ๋ฐ์ดํฐ ํ์ (0) | 2022.08.19 |
---|---|
๊ตฌ์กฐ์ฒด (0) | 2022.08.19 |
ํฌ์ธํฐ (0) | 2022.08.19 |
๋ฌธ์์ด (0) | 2022.08.19 |
๋ฐฐ์ด (0) | 2022.08.19 |
๋๊ธ