2010-06-09 4 views
0

내가 형태구조체가

class X 
{ 
    public: 
    //class functions 
    private: 
     A_type *A; 
     //other class variables 
}; 

및 구조체 A_type 생성자 내부

struct A_type 
{ 
    string s1,s2,s3; 
}; 

로 정의의 클래스 정의를 가지고, 내가 A에 대한 적절한 메모리를 할당하고 A [0 시도 ] .s1 = "somestring"; 세그먼트 화 오류가 표시됩니다. 는 선언의 이런 종류의 잘못인가, 아니면

편집 뭔가 놓치고 : OP에서 새로운 코드는 '메모리를 할당'무엇을 의미합니까 코멘트 [neilb]

#include <stdio.h> 
#include <math.h> 
#include <string> 
#include <iostream> 
using namespace std; 

struct HMMStruct { string a; }; 

HMMStruct *HMMs; 

int main() { 
    HMMs=(HMMStruct*)malloc(sizeof(HMMStruct)*2); 
    HMMs[0].a="sdfasasdsdfg"; 
    cout << HMMs[0].a << endl; 
} 
+1

더 많은 코드를 게시해야합니다. 어떻게 메모리를 할당하고 있습니까? 클래스 X를 어떻게 인스턴스화합니까? –

+1

"적절한 메모리 할당"이란 무엇을 의미합니까? 당신은 malloc이 아닌 새로운 것을 사용하고 있습니까? –

+4

전체 코드를 게시 할 수 있습니까? 귀하의 설명에 따라 가능한 여러 가지 문제가 있습니다. –

답변

1

에서 이동을? 당신은 '새로운 A_type'이라고해야만합니다. malloc을 호출하면 생성자가 실행되지 않고 할당이 작동하지 않습니다.

+0

포인터를 보내 주셔서 감사합니다! 어떤 1200 라인의 코드에서 모든 malloc을 뉴스로 바꾸는 것으로 끝났고 잘 작동합니다 :-) – Balakrishnan

3

는 왜 :

class X 
{ 
    public: 
    //class functions 
    private: 
     A_type a; 
}; 

즉, 왜 동적 A_type 인스턴스를 할당?

편집 : 게시 한 새 코드의 문제점은 malloc()을 사용한다는 것입니다. malloc()을 사용하면 문자열과 같은 비 POD 유형에 필수적인 생성자가 호출되지 않습니다. 당신은 C++ 프로그램에서의 malloc을 사용해서는 안 - 모든 새로운 사용하여 할당해야 제대로 생성자를 호출 할 것이다 :

HMMs= new HMMStruct[2]; 

을 그리고 당신의 코드가 정말 문자 * 회원들과 함께 작동하지 않습니다 - 그것은 단지 실패하지 않습니다 그래서 분명히.

+0

그는'A '를 배열로 접근하려고합니다.'A [0] .s1 = ...'에 주목하십시오. – Thorarin

+1

@ Thorarin OK, 그렇다면 왜 A_type의 벡터가 아닌가? –

+0

나를 때려 눕힌다. 그러나 나의 C++는 매우 녹슬다. :) – Thorarin

1

생성자 내부에서 A에 적절한 메모리를 할당하고 A [0] .s1 = "somestring"을 시도합니다. 분할 오류를 보여줍니다. 선언의이 종류 무효, 또는 내가 뭔가를 놓친 거지인가

버그는 A.를위한 메모리 할당에 당신이 게시되지 않은 코드에서 아마

아니면 당신은 더이 생성자 중 하나에서 메모리를 할당하지 않습니다.

0

C++을 사용하기 때문에 배열 대신 std :: vector를 사용하십시오. 그런 다음 문제 자체가 사라집니다. 의 라인 뭔가 :

#include <vector> 
#include <string> 
using std::string; 
using std::vector; 

struct A_type 
{ 
    string s1,s2,s3; 
    A_type(string str1,string str2, string str3): s1(str1), s2(str2), s3(str3) {}; 
}; 
class X 
{ 
public: 
    X(); 
private: 
    vector<A_type> A; 
}; 
X::X() 
: A(vector<A_type>()) 
{ 
    A.push_back(A_type("something","or","other")); 
    //... 
    // Access vector items by A[index] or better A.at(index) 
} 

더 나은 C++ 이럴 것이다.

0

문제는 new 대신 malloc을 사용한다는 것입니다. Malloc은 그냥 원시 바이트를 할당하고, new는 객체를위한 메모리를 할당하고, 그 객체의 생성자를 호출한다. 본질적으로 초기화되지 않은 값을 가진 클래스/구조체가 남아 있습니다. 귀하의 경우 문자열이 초기화되지 않았으므로 사용하려고 시도하면 seg 오류가 발생합니다. 원하는 것은 다음과 같습니다.

#include <stdio.h> 
#include <math.h> 
#include <string> 
#include <iostream> 
using namespace std; 

struct HMMStruct { string a; }; 

HMMStruct *HMMs; 

int main() { 
    HMMs = new HMMStruct[2]; 
    HMMs[0].a="sdfasasdsdfg"; 
    cout << HMMs[0].a << endl; 
    delete [] HMMs; // don't forget to delete. 
} 
관련 문제