ecsimsw
Dynamic allocated array 본문
constructor
ary = new int*[count_rows];
for (int i = 0; i < count_rows; ++i)
ary[i] = new int[count_columns];
destructor
for (int i = 0; i < count_rows; i++)
delete[] ary[i];
delete[] ary;
Array of pointers != Pointer to an array
int ary[1][2] = { 0, };
int(*ptr1)[2];
int** ptr2;
ptr1 = ary;
// ptr2 = ary; Error
ptr2 = new int* [1];
for (int i = 0; i < 1; ++i)
ptr2[i] = new int[2];
std::cout << "ary : "<<ary<<std::endl; // 0045F034
std::cout << "ptr1 : " << ptr1<< std::endl; //0045F034
std::cout << "ptr1 +1 : "<<++ptr1 << std::endl; //0045F03C
std::cout << "ptr2 : "<<ptr2<< std::endl; //007ABF48
std::cout << "ptr2 +1 : "<<++ptr2<< std::endl; // 007ABF4C
std::cout << sizeof(ary) << std::endl; //8
std::cout << sizeof(ptr1) << std::endl; //4
std::cout << sizeof(ptr2) << std::endl; //4
The difference between the two is:
- Array of pointers is an array which consists of pointers. Each pointer in the array points to a memory address. For example, you can have an array of Pointers pointing to several strings. This way we can save memory in case of variable length strings. ex) char *names[]={“bob”, “steve”, “Patrick”};
- Pointer to an array is a pointer which points to the whole array ,not just the first element of the array. This is especially useful in case of multi dimensional arrays. ex) int (*ptr)[5] ptr points to the whole array consisting of 5 Integers.
malloc, free != new, delete
malloc/free은 객체 초기화와 소멸을 수행하지 않기 때문에 이러한 루틴들의 사용은 대부분의 경우에 추천되지 않는다. new와 delete는 객체 초기화를 직접 수행하는 것을 피하기 위해 C++의 첫 번째 버전에서 도입되었다
malloc은 메모리를 동적으로 할당하는 것에 목적으로 두어 할당 시 생성자 호출이나 초기화가 불가능하지만, new는 할당 시 생성자 호출, 초기화가 가능하다.
realloc으로 재할당하여 이미 할당된 공간의 크기를 바꿀 수 있다. 반면 new는 같은 공간에서 재할당이 불가능하므로 소멸 후 다시 생성해야하기 때문에, 공간의 크기를 자주 변경해야하는 객체는 오히려 malloc, realloc, free를 이용하는 것이 효율적일 수 있다.
'Language > C++, C#' 카테고리의 다른 글
Array vs Pointer. MIPS aspect (0) | 2019.06.27 |
---|---|
OOP / Duck typing / 덕 타이핑 (0) | 2019.05.07 |
Explicit (0) | 2019.04.23 |
static_cast / reinterpret_cast (0) | 2019.04.23 |
Function pointer / 함수 포인터 (0) | 2019.04.20 |