programing

C에서 C++의 신규/삭제와 동등한 것은 무엇입니까?

bestprogram 2023. 8. 15. 11:16

C에서 C++의 신규/삭제와 동등한 것은 무엇입니까?

C에서 C++의 신규/삭제와 동등한 것은 무엇입니까?

아니면 C/C++에서도 마찬가지인가요?

없습니다.new/delete다의 표현

생성자/파괴자를 무시하고 안전을 입력하는 경우 가장 가까운 은 및 함수입니다.

#include <stdlib.h>

int* p = malloc(sizeof(*p));   // int* p = new int;
...
free(p);                       // delete p;

int* a = malloc(12*sizeof(*a));  // int* a = new int[12];
...
free(a);                         // delete[] a;

생성자는 C++에서 예외를 발생시킬 수 있습니다.의 등가물player* p = new player();C에서는 이런 것일 것입니다.

struct player *p = malloc(sizeof *p);
if (!p) handle_out_of_memory();
int err = construct_player(p);
if (err)
{
    free(p);
    handle_constructor_error();
}

의 등가물delete p소멸자는 절대 "결함"해서는 안 되기 때문에 더 간단합니다.

destruct(p);
free(p);

사용new그리고.deleteC++에서는 동적 메모리 할당/해제와 객체 초기화/해제라는 두 가지 책임을 수행합니다.

다른 모든 답변에서 알 수 있듯이 동적 메모리를 할당하고 해제하는 가장 일반적인 방법은 호출입니다.malloc그리고.freeOS별 기능을 사용하여 대용량 메모리를 가져오고 해당 메모리에 개체를 할당할 수도 있지만, malloc이 충족하지 못하는 특정 요구 사항이 있는 경우에만 더 드문 일입니다.

C에서 대부분의 API는 다음의 다른 역할을 수행하는 한 쌍의 기능을 제공합니다.new그리고.delete.

예를 들어, 파일 api는 열림 및 닫힘 함수 쌍을 사용합니다.

// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;

// C
FILE *fp=fopen("c:\\test.txt", "r"); 
fclose(fp);

그럴 수도 있습니다.fopen사용하다malloc스토리지를 할당합니다.FILE또는 프로세스 시작 시 최대 파일 포인터 수에 대해 정적으로 테이블을 할당할 수 있습니다.요점은 API가 클라이언트가 사용할 필요가 없다는 것입니다.malloc그리고.free.

다른 API는 클라이언트 코드가 자동, 정적 또는 동적 스토리지를 사용할 수 있도록 하는 생성자 및 소멸자에 해당하는 계약의 초기화 및 해제를 수행하는 기능을 제공합니다.한 예로 pthreads API가 있습니다.

pthread_t thread;

pthread_create( &thread, NULL, thread_function, (void*) param); 

이를 통해 클라이언트는 더 많은 유연성을 가질 수 있지만 라이브러리와 클라이언트 사이의 결합을 증가시킵니다. 클라이언트는 클라이언트의 크기를 알아야 합니다.pthread_t라이브러리가 할당과 초기화를 모두 처리하는 경우 클라이언트가 유형의 크기를 알 필요가 없으므로 클라이언트를 변경하지 않고도 구현이 달라질 수 있습니다.어느 쪽도 C++만큼 클라이언트와 구현 간의 결합을 도입하지 않습니다.(C++을 OO 언어보다 vtables가 포함된 템플릿 메타프로그래밍 언어로 생각하는 것이 더 나은 경우가 많습니다.)

정확한 복제본은 아니지만 호환 가능한 복제본은 malloc이고 무료입니다.

<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);

시공자/파괴자 없음 - 어쨌든 C는 그것들을 가지고 있지 않습니다.

크기를 메리크얻면다사음용다니합을으려기를 사용하면 .sizeof교환입니다.

다차원 어레이로 작업하려면 새 어레이처럼 여러 번 사용해야 합니다.

int** ptr_to_ptr = (int **) malloc(12 * sizeof(int *)); //assuming an array with length 12.
ptr[0] = (int *) malloc(10 * sizeof(int));   //1st element is an array of 10 items
ptr[1] = (int *) malloc(5 * sizeof(int));    //2nd element an array of 5 elements etc

malloc / free 함수를 사용합니다.

늦었지만, C의 방식에 맞는지는 잘 모르겠지만, 이 구문이 정말 마음에 듭니다.

#include <stdlib.h>

#define new(type, length) malloc(sizeof(type)*(length))
#define delete(x) free(x)
int main()
{
    int *test = new(int, 30);
    delete(test);
}

언급URL : https://stackoverflow.com/questions/2839551/whats-the-equivalent-of-new-delete-of-c-in-c