|
do you keep allocating memory somewhere, and never releasing it ?
|
|
|
|
|
when i don't use printf or CString memory don't increase, it remains constant.
callbacks are called or updated by every second. even i need to check my code again.
my doubt is printf prints the output to stdout or console. is it that buffering ? or anything else
Jalsa
|
|
|
|
|
do you call CString::GetBuffer() by any chance ?
|
|
|
|
|
Maybe you're doing a wrong usage of CString objects. Could you post the code?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Hi,
Recently a friend of mine who is learning C++ wrote a code as given below
class SingleTon
{
public:
static SingleTon& GetInstance()
{
return *ptr;
}
private:
static SingleTon* ptr;
};
SingleTon* SingleTon::ptr = NULL;
int _tmain()
{
SingleTon &ref = SingleTon::GetInstance();
if(&ref == NULL)
{
cout << "The reference is NULL";
}
return 0;
}
My query is why didn't this code crashed. The program simply printed "The reference is NULL" and exited. I am a bit confused here, The pointer is initialized to NULL and in GetInstance() it is dereferenced. In my opinion as soon as it was dereferenced, the program should have crashed!! Or is there something basic I am missing?
Thanks & Regards
|
|
|
|
|
IMHO the pointer is never dereferenced in the above code.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
probably because you tested in debug mode (where pointers are not actually initialized to 0x00000000).
test in release mode and tell us if it still doesn't crash...
|
|
|
|
|
toxcct wrote: test in release mode and tell us if it still doesn't crash...
I've done. It behaves exactly the same.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
ok; it was just a guess, i have no compiler here.
however, i don't really like the way the OP uses NULL. i'm not even sure a reference gets a NULL pointer "dereference"...
|
|
|
|
|
toxcct wrote: however, i don't really like the way the OP uses NULL
I don't like too. Nonetheless, the address of operator seems to be legitimate on the reference.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
I had tested in Release mode as well, yet the program never crashed.
I had used VC++ 2005 compiler with SP1 on Windows XP Pro + SP2
Thanks
|
|
|
|
|
I dont think it should not crash at all unless you are trying to access or invoke any members of ref. (Though its technically very unlikely to have an object at address 0x00 - its just an address like any other).
|
|
|
|
|
This is the beauty of references!
It refers to an instance of an object at a certain address, it's not an actual instance of an object. In this case the address is NULL, which is perfectly legitimate.
However, if you try to use any of its members it would of course crash since the 'this' pointer is NULL.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Deferencing is accesing value, indirectly through pointer.
In your example I say it is not deferencing, its referencing.
int val = *ptr; // accesses value;
int &ref = *ptr; // don't accesses value;
int *ptr2 = &*ptr1; // here Value of (*ptr1) is not accessed, as ptr2 is not going to store the address the temporary value (*ptr1), instead stores address itself (ptr1).
similarly
int &ref = *ptr; is not dereferencing the value but referencing the memory location;
"A reference holds the address of an object, but behaves syntactically like an object." from msdn;
int *ptr2 = &*ptr1; is same as int &ref = *ptr; check the code generated for the two expression.
and "int *ptr1 = NULL; int *ptr2 = &*ptr1" also won't crash.
|
|
|
|
|
Not sure if this is applicable here. If you change the original class as
class SingleTon
{
public:
static SingleTon GetInstance()
{
return *ptr;
}
private:
static SingleTon* ptr;
};
SingleTon* SingleTon::ptr = NULL;
int _tmain()
{
SingleTon ref = SingleTon::GetInstance();
if(&ref == NULL)
{
cout << "The reference is NULL";
}
return 0;
}
The program still doesn't crash, but it doesn't prints anything since in this case
&ref != NULL
And even if I added another member function and accessed it through the "ref" variable, the program still didn't crashed in the release mode and in fact it gave me the correct values
Thanks
|
|
|
|
|
ahh, that is empty class, put data member. when you dereferencing no data is accessed in empty class.
try this,
class SingleTon
{
char m_c;
public:
static SingleTon GetInstance()
{
return *ptr;
}
private:
static SingleTon* ptr;
}; it will crash
and
class SingleTon
{
char m_c;
public:
static SingleTon& GetInstance()
{
return *ptr;
}
private:
static SingleTon* ptr;
}; it won't crash even with data member, my reply is applicable here also.
|
|
|
|
|
Thanks Rajkumar for the explaintion
But I do have more queries. If I add a member method like this
class SingleTon
{
char m_c;
public:
static SingleTon &GetInstance()
{
return *ptr;
}
std::string GetClassName()
{
return std::string("SingleTon Class");
}
private:
static SingleTon* ptr;
};
and access it like this
SingleTon& ref = SingleTon::GetInstance();
std::string className = ref.GetClassName();
cout << className.c_str();
The program doesn't crash and it prints the correct value. Can you please explain why it should print the correct value? Now we have a member variable also. Or is it the case that the since the method is not accessing the data member variable, it is not crashing and it is treated similar to empty class scenario?
Thanks
|
|
|
|
|
psychedelic_fur wrote: Or is it the case that the since the method is not accessing the data member variable
yes,
you can also do the similar code.
(*(SingleTon *)0).functionAccessNoDataMember();
(*(SingleTon *)0).functionAccessDataMember(); // crashes
calling a member function is not dereferencing, member function is called as if a normal function with storing the object address to register which is called this pointer, whenever a data member is accessed the this pointer is dereferenced like
*(this + data member offset) // causes access violation if this pointer is not valid address.
calling member function is not crashing because code is same for all instance of object and function pointer is same no need to call like (this + memberfunction)();
|
|
|
|
|
i need to get the time zone string currently set by the user
e.g. (GMT+5:30)..........
i dont want to do any calculations just need the string
Thanks in advance
|
|
|
|
|
You can use GetTimeZoneInformation().
|
|
|
|
|
hi,
I have a namespace extension under common file dialog on windows xp.
The 'Create New Folder' icon on the dialog's toolbar becomes disabled, when I choose the namespace icon in the upper combobox (Drop-down combo box that displays the current drive or folder, cmb2).
My namespace extension has a custom view, maybe this causes the problem?
Thanks,
zuma
|
|
|
|
|
Hi again,
I'm using UNICODE char set and have this error of converting
char[260] to LPWSTR and...
CString to LPCSTR
I'm not familiar with UNICODE but i have to use it.
Hope you can help me.
Thanks.
|
|
|
|
|
why don't you just always use CString with LPCTSTR ???
when you handle literals, just round them with the _T() macro...
that way, you don't even have to think to convert from ascii to unicode and vice versa...
for example:
CString str = _T("Hello World !");
|
|
|
|
|
Change into property settings ...use
project->configuration property->general
see, character set change into multibyte characterset..
then your code is running proper..
*****THANKS N ADVANCE****
Mathen.K
(I WILL TRY MY LEVEL BEST )
|
|
|
|
|
TooShy2Talk wrote: I'm not familiar with UNICODE but i have to use it.
rowdy_vc++ wrote: see, character set change into multibyte characterset..
Are you answering queries without even understanding them?
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|