markdown 기억공간형식과동적대입

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 기억공간형식과동적대입相关的知识,希望对你有一定的参考价值。

# 기억공간 형식과 동적 대입
```c++
float * p_fees = new float[20];
```
p_fees 포인터는 이 변수가 선언되어 있는 함수가 종료될 때 사라지므로 메모리의 주소를 전달할 필요(외부 링크)가 있음.

extern float * p_fees;

- new 연산자를 이용한 초기화
```c++
int *pi = new int (6); // *pi를 6으로 초기화
double * pd = new double (99.99) // *pd를 99.99으로 초기화
struct where {double x; double y; double z;};
where * one = new where {2.5, 5.3, 7.2};
int * ar = new int [4] {2, 4, 6, 7};
int * pin = new int {6}; // *pin을 6d으로 초기화
double * pdo = new double {99.99};
```
- new 가 실패하는 경우
메모리의 양을 확보할수 없을 경우, std::bad_alloc 예외를 반환한다.

- new: 연산자, 함수, 대체함수
```c++
int * pi = new int;
int * pi = new(sizeof(int));

int * pa = new int[40];
int * pa = new (40 * sizeof(int));
```

## 예시
```c++
int * psome = new int [10];
delete [] psome;
```
```c++
char animal[20] = "bear";
char *ps;

ps = animal;
ps = new char[strlen(animal) + 1];
strcpy(ps, animal);
```
```c++
int main()
{
    char* name;    // 포인터를 만들지만 메모리는 대입하지 않는다
    
    name = getname();    // 문자열의 주소를 name에 대입한다
    cout << (int *)name << ": " << name << "\n";
    delete[] name;      // 메모리 해제
    
    name = getname(); 
    cout << (int *)name << ": " << name << "\n";
    delete[] name;
    
    return 0;
}

char * getname()        // 새 문자열을 가리키는 포인터를 리턴한다
{
    char temp[80];      // 임시 배열
    cout << "이름을 입력하십시오: ";
    cin >> temp;
    char * pn = new char[strlen(temp) + 1];
    strcpy(pn, temp);    // 문자열을 더 작은 공간으로 복사한다
    
    return pn;        // 함수가 종료될 때 임시 배열인 temp는 소멸한다
}
```

---
# 위치 지정 new 연산자
일반적으로, new 연산자는 사용자가 요청한 메모리 크기를 충분히 다룰 수 있을 만큼의 메모리 블록을 힙에서 찾는다. 그런데 new 연산자는 사용할 위치를 사용자가 지정할 수 있는 위치 지정 new라는 한 가지 변형이 있다. 프로그래머는 메모리 관리 절차를 설정하거나 특정 주소를 통해 접근하는 하드웨어를 다루고, 특정 메모리 위치에 있는 객체를 생성하는 데에 이 기능을 사용할 수 있다.

위치 지정 new는 각괄호와 함께 또는 각괄호 없이 사용할 수 있다.

```c++    
#include <new>
struct chaff
{
    char dross[20];
    int slag;
};

char buffer1[50];
char buffer2[50];

int main()
{
    chaff *p1, *p2;
    int *p3, *p4;
    
    // new의 일반 형식
    p1 = new chaff;     // 구조체의 힙에 놓는다
    p3 = new int[20];   // int 배열을 힙에 놓는다
    
    // 위치지정 new
    p2 = new (buffer1) chaff;   // 구조체를 buffer1에 놓는다
    p4 = new (buffer2) int[20]  // int 배열을 buffer2에 놓는다
}
```
-> LISTING 09.10 참조

---

# 기억공간의 종류
- 자동 공간(automatic storage)
함수가 호출되는 순간에 자동으로 생겨나 그 함수가 종료되는 시점까지만 존재함.
자동변수는 스택에 저장된다. 메모리상의 스택에 그 값이 순차적으로 저장되고, 역순으로 해제되는 것을 의미한다(LIFO). 따라서 스택은 프로그램이 실행하는 동안 늘었다 줄었다를 반복한다.
- 정적 공간(static storage)
프로그램이 실행되는 동안에 지속적으로 존재하는 공간.
- 동적 공간
new와 delete 연산자와 같이 융통성 있는 방법을 제공한다. 자유공간이라 부르는 메모리 풀을 관리한다. 메모리 누수를 피하려면 new와 delete연산자를 가능한 가깝게 결합하여 사용하는 습관을 들여야 함.

以上是关于markdown 기억공간형식과동적대입的主要内容,如果未能解决你的问题,请参考以下文章

markdown 이름공간(名称空间)과使用

sh macOS Sierra에서원화(₩)대신백쿼트(`)입력하기

计算多字节字符的数量

廣開土太王陵碑(複製本)

text React Hooks공식문서

text React공식문서한글