2012-07-31 3 views
0

줄의 문제점은 무엇입니까 obj-> ip = "127.0.0.1";? 여기에 액세스 위반이 발생합니다.스마트 포인터 사용시 액세스 위반

내부 수업 기억 - 개인 회원을 사용할 수 있습니까? 그렇습니다. 생성자 본문에

typedef struct Header 
{ 
    SOCKET sock; 
    SOCKADDR_IN addr; 
    WORD WSAVersion; 
    WSAData data; 
    char *ip; 
    u_short port; 
    int result; 
} Header; 

class A 
{ 
private: 
    std::unique_ptr<Header> obj; 

public: 
    A(void) 
    { 
     obj(new Header); 
     obj->ip = "127.0.0.1"; // here comes the error! 
    } 

    ~A(void) 
    { 
     obj.release(); 
    } 
}; 

int main(void) 
{ 
    std::unique_ptr<A> handler(new A); 
+3

스마트 포인터의 전체 지점은 명시 적으로 리소스를 해제하지 않는다는 것입니다. 소멸자를 제거하십시오. – GManNickG

+0

@GManNickG obj.reset (새 클래스)으로 편집했습니다. 그리고 그것은 잘 작동하고 소멸자에 대한 조언을 주셔서 감사합니다, 당신은 맞습니다 :) –

답변

4

obj(new Header);은 무의미, 당신은 – 다음 시도 (완전히 처음부터 스마트 포인터를 사용하는 목적을 물리 치고) 메모리가 누수있어 :

class A 
{ 
    std::unique_ptr<Header> obj; 

public: 
    A() : obj(new Header()) // value-initialize object, not default-initialize 
    { 
     obj->ip = "127.0.0.1"; 
    } 
}; 
+2

명확하지 않은 경우, 누수의 원인이되는 소멸자의'obj.release()'입니다. –

+0

@ MarkRansom 그것이 누수를 일으킨다는 것을 이해했지만 그것이 정확히 어떻게 (techniqully) –

0

감사를 들어 도움, 얘들 아! 필자는 소스를 편집했으나 위반없이 잘 작동하며 원격 호스트에 연결합니다.

#include <iostream> 
#include <memory> 
#include <WinSock2.h> 
#pragma comment(lib, "Ws2_32.lib") 
typedef struct Header 
{ 
    SOCKET sock; 
    SOCKADDR_IN addr; 
    WORD WSAVersion; 
    WSAData data; 
    char *ip; 
    u_short port; 
    int result; 
} Header; 
class Connector 
{ 
private: 
    std::unique_ptr<Header> obj; 
public: 
    Connector(void) 
    { 
     obj.reset(new Header); 
     obj->ip = "193.201.231.44"; 
     obj->port = 2775; 
     obj->WSAVersion = 0x202; 
     obj->addr.sin_family = AF_INET; 
     obj->addr.sin_addr.s_addr = inet_addr(obj->ip); 
     obj->addr.sin_port = htons(obj->port); 
     this->MakeConnection(&obj); 
    } 
    ~Connector(void) 
    { 
     obj.release(); 
    } 
    int MakeConnection(std::unique_ptr<Header> *pointer) 
    { 
     (*pointer)->result = WSAStartup((*pointer)->WSAVersion, &(*pointer)->data); 
     if((*pointer)->result != NO_ERROR) 
     { 
      std::cout << "WSA failed to start with the error: " << std::endl << (*pointer)->result << std::endl; 
      return 0; 
     } 
     else 
     { 
      std::cout << "WSA started successfully" << std::endl; 
      (*pointer)->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
      if((*pointer)->sock == SOCKET_ERROR) 
      { 
       std::cout << "Failed to init new socket, with the error: " << WSAGetLastError() << std::endl; 
       return 0; 
      } 
      else 
      { 
       (*pointer)->result = connect(obj->sock, (sockaddr*)&(*pointer)->addr, sizeof((*pointer)->addr)); 
       if((*pointer)->result == SOCKET_ERROR) 
       { 
        std::cout << "Failed to connect to the remote host " << (*pointer)->ip << ":" << (*pointer)->port 
         << ", with the error: " << WSAGetLastError() << std::endl; 
        return 0; 
       } 
       else 
       { 
        std::cout << "Connected to the remote host " << (*pointer)->ip << ":" << (*pointer)->port << std::endl; 
        return 1; 
       } 
      } 
     } 
    } 
}; 
void init(void) 
{ 
    std::unique_ptr<Connector> obj; 
    obj.reset(new Connector); 
    obj.release(); 
} 
int main(void) 
{ 
    init(); 
    return 0; 
}