2016-07-15 4 views
1

new 연산자를 사용하여 다음 코드를 작성하는 방법은 무엇입니까? 자세히 설명해주십시오. 미리 감사드립니다. malloc을 new로 변환

#include<alloc> 
#define MAXROW 3 
#define MAXCOL 5 
using namespace std; 

int main() 
{ 
    int (*p)[MAXCOL]; 
    p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p)); 
} 
+0

''은 표준 헤더가 아닙니다. 'malloc'은''을 사용하십시오. – chris

답변

2

를 사용할 필요가 new[] 경우 newint(*)[MAXCOL] - 2D 배열 소멸과 동일한 유형을 반환합니다. delete[] p;을 잊지 마세요.

마지막 부분은 std::vector의 중요성을 불러옵니다. 아마도 컴파일 타임에 두 번째 차원의 크기를 알 수있을 것입니다.따라서 std::vector<std::array<int, MAXCOL>>delete[] 문을 필요로하지 않는 추가 보너스와 함께 작동하며 크기 (MAXROW)를 알고 있습니다. 가능하다면 이것을 사용하십시오.

실제로 예제에서 두 차원 모두 컴파일시 알려 지므로 std::array<std::array<int, MAXCOL>, MAXROW>도 여기에서 작동합니다. 일반적으로 동적 할당보다 바람직합니다.

컴파일 타임에 어느 차원도 알려지지 않은 경우 모든 내부 벡터가 같은 크기임을 알면 성능을 높이기 위해 벡터 또는 전용 행렬 클래스의 벡터가 가장 좋습니다.

1

방법 new 연산자를 사용하여 다음과 같은 코드를 작성하는 문자 질문?

& hellip; 당신이 생각하는 것 이상을 의미합니다.

new

연산자는 C++ new 연산자 제외한 C의 malloc 대략 유사한 간단한 직접 할당 함수 인 사용자 정의 중 하나에 의해 대체 가능하다.

당신은 아마 new 표현을 의미한다. 이 표현식은 할당을 위해 new 연산자를 호출하고 은 할당 된 것이 클래스 유형 인 경우 초기화를 위해 생성자를 호출합니다. 그리고 타입 안전합니다.

하지만 해당 어레이는 그 중 하나를하지 싶지만, 표준 라이브러리에서 간단하게 std::vector.

#include <vector> 
using namespace std; 

auto main() 
    -> int 
{ 
    int const n_rows = 3; 
    int const n_cols = 5; 

    using Row = vector<int>; 

    vector<Row> v(n_rows, Row(n_cols)); 

    // E.g. v[1] is a row, and v[1][2] is an int item in that row. 
} 

당신이 너무 자주 행렬을 사용하지 않는 경우에도, 포장하는 좋은 아이디어가 될 수 있습니다


여기 매트릭스를 생성하는 벡터의 std::vector를 사용하는 예제입니다 클래스에서 행렬의 일반적인 개념. 간단한 방법은 저장 용으로 하나의 std::vector을 사용하는 것입니다. at 함수 또는 클라이언트 코드에서 인덱싱을위한 operator()입니다. 아직 직접하고 싶지 않다면 예를 들어 Boost 라이브러리는 행렬 클래스를 제공합니다. 이 이후

+0

일반적으로 객체와 같은 N-dim 배열에 중첩 벡터를 사용하지 않습니다. 느려지는 요소에 액세스하기위한 여러 개의 회귀가 있습니다. – doug

+0

@doug : 동의합니다. 그래서 매트릭스 스토리지로 단일 벡터를 사용하는 것이 좋습니다. 간단한 선언이 중첩 된 이유입니다. 고정밀. :)) –

+0

단일 벡터를 사용하고 여전히 2D 내장 배열의 의미를 사용하는 아주 간단한 방법이 있습니다. (http://stackoverflow.com/questions/36123452/statically-declared-2-d-array-c-as-data-member-of-a-class/36123944#36123944) – doug

1

는 C++ 내가 std::array 또한 std::unique_ptr 당신이 delete를 사용할 필요가 new 사용하는 경우, free 않은 ALLOC 또는 무료 메모리를 사용한다 malloc을 사용하여 권 해드립니다 것이다; 와 평소처럼, 이것은 자유 스토어와의 2 차원 배열 (MAXCOL에 의해 MAXROW)를 할당

p = new int[MAXROW][MAXCOL]; 

: 당신은 당신이 말 그대로 질문에 대답, 아주 간단하게 delete[]

#include <cstdlib> 
#include <memory> 
#include <array> 
#define MAXROW 3 
#define MAXCOL 5 
using namespace std; 

int main() 
{ 
    int (*p)[MAXCOL]; 
    p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p)); 
    free(p); //free memory 
    array<int,MAXCOL> *p1 = new array<int,MAXCOL>[MAXROW]; 
    delete []p1; //use this to delete the variable 
    array<array<int,MAXCOL>,MAXROW> *p2 = new array<array<int,MAXCOL>,MAXROW>; 
    delete p2; // normal delete for this one 
    auto p3 = make_unique<array<array<int,MAXCOL>,MAXROW>>(); 
    //no delete needed for p3, it is a smart pointer. 
} 
관련 문제