여기 내 문제입니다.포인터를 통해 char *에 액세스하면
나는 char *를 정기적으로 수정하는 클래스가 있습니다.
이 값을 읽을 수 있어야하는 또 다른 클래스가 있습니다. 그래서 char *를이 두 번째 클래스의 생성자에 전달하여 필요할 때 값을 확인할 수있게하려고합니다. 를 ClassA에서
: ClassB가에서
bool f_valid = false; // global
m_eventCatcher.addProxy(porting::shared_ptr<CallbackProxy>(new handleCall(&f_valid)));
:
struct handleCall
{
bool* m_dataValid;
handleCall(bool* result)
{
// saving the pointer to the boolean that I want to change
m_dataValid = result;
}
method()
{
if (smth)
{
(*m_dataValid) = false;
}
}
};
이 유형 부울입니다, 제가 다른 매개 변수가 구현의 예를 들어 보겠습니다 지금까지 그렇게 좋았습니다 - 이것이 효과가있는 것 같습니다. 두 클래스 모두이 부울을 변경하고 액세스 할 수 있습니다.
이제 char * (문자열을 사용할 수 없으므로 URL 주소와 같은 간단한 텍스트를 저장하는 가장 좋은 방법이라고 생각하십니까?)와 동일한 작업을 수행해야합니다. 그래서 여기
은 내가 쓴 것입니다 :
를 ClassA :
const char* f_url = "blah blah"; // global
m_eventCatcher.addProxy(porting::shared_ptr<CallbackProxy>(new handleCall2(&f_url)));
ClassC :
struct handleCall2
{
char ** m_url;
handleCall2(char** url)
{
// saving the pointer to the char*
m_url= url;
std::cout << (*m_url) << std::endl; // prints out url fine
}
method()
{
std::cout << (*m_url) << std::endl; // by this time the value has been changed by ClassA, and I print out some rubbish - symbols, squares, etc.
}
};
나는 문자열이 변경 되었기 때문에, 그 '주소도 변경 문제가되는 것 같아요 ? 나는 정말로 혼란스러워지고있다. 누군가가 나에게 무슨 일이 일어나고 있는지, 그리고 내가이 상황에서 무엇을해야 하는지를 말해 줄 수 있는가?
UPDATE :
문제가 나는 문자 * 수정 방법에 같은가 보이는 : * 숯불에 문자열 값을 쓰는 다른 방법이
f_url = "new text"; // works fine
f_url = fileUrl.c_str(); // doesn't work! I get rubbish in the value when I try to access it from ClassB
strcpy(m_url, fileUrl.c_str()); // I also removed const from the variable and tried this - got a crash "access violation using location" :(
거기를?
한 단어 : 참고 문헌. –
아, 그리고 또 다른 것 : ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string)은 원시 포인터보다 문자열을 다루는 것이 훨씬 낫습니다. –
문자열은 컴파일하는 동안 파일의 .rdata 섹션에 할당됩니다. 파일을 수정하면 다른 데이터를 겹쳐 쓸 수 있습니다. 대신'std :: string'을 사용하십시오. –