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 기억공간형식과동적대입的主要内容,如果未能解决你的问题,请参考以下文章