|
I've experienced this too. I think IIS deliberately holds the ref count up to stop the object unloading. This way, ASP experiences faster application startup.
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
Can anyone tell me when I call data(), the const char * that gets returned, is it safe after the string goes out of scope ? If not, how do I get access to the buffer of a string without having to create a new char * and doing a strcpy ???
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
calling c_str() and data() both return pointers to the internal data. So if the basic_string goes out of scope, these pointers will be invalid.
If you want a copy of the data use copy(), which I guess you will still have to allocate a buffer for this as well.
|
|
|
|
|
I was hoping to get out of creating the pointer, if I could. But this is what I have done instead, so thanks for the advice.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
Maybe you should just copy the contents to another std::string? The cost will not be greater than new/strcpy, and may be less if your STL uses copy-on-write.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
This question, like the other one I asked this afternoon, was motived by my having to write code to fit into interfaces provided for me. Returning anything other than a char * was not an option for me. In the end I did it the weasel way and created new char * to hold the final string. I'm guessing that was the intent of the std library designers neglecting to provide such a function.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
If I have a vector, of CStrings for example, and I am stepping through the vector in a loop, like this:
StringVector::iterator it = aHeadComponents.begin();
StringVector::iterator end = aHeadComponents.end();
for(; it != end; ++it)
now inside the loop I need to pass each string to a function that takes a CString pointer, what do I do ? I know I can dereference the iterator to get a CString, but I was under the impression that what I have should *not* be considered a CString pointer ? Is this wrong ? Am I worrying about nothing ? Please help....
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
Can't a vector hold CString pointers? Then just pass the pointers from dereferencing the iterator? Or you could try the way you have it now, declare a CString str just to hold the string from the vector on each loop passing the pointer till the end.
Or am I way off base Christian? lol I'm no pro with STL yet, but hopefully I gave you some ideas.
Cheers
|
|
|
|
|
Jay Beckert wrote:
Can't a vector hold CString pointers? Then just pass the pointers from dereferencing the iterator?
Yes, but I did not write the code.
Jay Beckert wrote:
Or you could try the way you have it now, declare a CString str just to hold the string from the vector on each loop passing the pointer till the end.
This is a possiblity that had not occured to me, although it adds a temporary. Thanks.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
I assume your vector is declared like this:
typedef std::vector(CString) StringVector;
If this is the case then you will need to take the address of your CString object in order to turn it into a pointer after you dereference the iterator.
for(;it != end; ++it)
{
function(&(*it));
}
By dereferencing the iterator, you are invoking the operator*(), which will return the CString object. Then to get the pointer take the address of the dereferenced iterator (*it) .
|
|
|
|
|
That was my first thought, but I'm trying to convince these people that STL is *nice*, and that is just *ugly*. There's no other way ?
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
I think that stl nice, you should just convey to the people that the iterator is an object, and in order to get access to the data that it represents, you will need to derefence it.
In the case of the vector<cstring>, if you want a pointer to a CString, you will need to take the address of the object once you have the CString.
If you wanted to do the same thing from a map iterator you would have to do this:
&(it->second)
It looks funny, but it is straight forward, but if you convey what an iterator is for and how it works, I think that people will see that it is nice rather than ugly.
|
|
|
|
|
I got a question for you guys since we're on STL. Let's say with a Map, we have .first , .second. What about third, fourth? Is it possible for a declare a Map as so;
typedef std::map< int, CString, CString, CString > MyMap;
MyMap m_map;
MyMap::iterator it;
it = m_usermap.find(int);
CString str = (*it).third;
Is this possible or would I have to write my own template?
|
|
|
|
|
No, it is not possible. You can have pretty much the same effect, however, by suitably defining the second parameter of your map s, like this:
struct string_triplet
{
std::string first;
std::string second;
std::string third;
};
typedef std::map<int, string_triplet> MyMap;
MyMap m_map;
it = m_usermap.find(i);
CString str = it->second.first;
CString str2 = it->second.second;
CString str3 = it->second.third;
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
do anyone know how to write a copy of a pointer where the copy cant change what the original pointer is pointing to kinda like using call by value or call by constant reference but using pointers. i am having trouble doing this because if i make it constant, I cant change it, i can use reference but because the whole program is implemented with pointers i wont be able to use it. do anyone know how to get around this problem???
ex.
int CComputer::CheckForMove(const CBoard* pBoard, int depth)
but by doing this i cant call most of the function that would change the board because that would give me a syntax error...
i wanted to used CheckForMove(const CBoard& rBoard, int depth)
but i wont be able to use it because my whole program is done using pointers...
anyways, thank you for your help...
|
|
|
|
|
I *believe* the syntax is int * const pConstInt;
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
yah your right but is there way i can use pointer and not use reference to do my function...
hey, christian thankx for the help
|
|
|
|
|
I don't understand ? If I do this:
int * const pInt = new int;
I can do this with no problems:
*pInt = 5;
because the value is not const. I cannot do this:
pInt = new int;
because the pointer *is*. Isn't that what you wanted ?
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
|
|
|
|
|
ok ill try that... thanks
|
|
|
|
|
In a Win32 Application I loaded RICHED32.DLL using
HINSTANCE ghRichInst = LoadLibrary("RICHED32.DLL");
But when I process WM_DESTOY message and I used folowing code to free the module
if(NULL!=ghRichInst)
{
FreeLibrary((HMODULE)ghRichInst);
ghRichInst = NULL;
}
But windows pops up with a message saying that it has encountered an exception.
Plz help
|
|
|
|
|
Check that the ghRichInst handle has the same value at the FreeLibrary call as it did when it was loaded.
I know it sounds far fetched, but I saw a case recently where a string value (actually a version string loaded from the DLL) overwrote the module handle with the same disastrous results.
We had to open a memory window on the handle (you can get the addr from the watch window) and start F10ing through the code - luckily it happened shortly after the LoadLibrary call.
|
|
|
|
|
The handle value remains the same. I called GetLastError() just before and after calling FreeLibrary(). I got the following messages respectively.
---------------------------
GetLastError
---------------------------
The handle is invalid.
GetLastError
---------------------------
The system cannot find the file specified.
|
|
|
|
|
Have you tried freeing the library after the default implementation of WM_NCDESTROY is called?
MS doesn't even both freeing the library until process exit. To be perfectly honest, there is no reason to free the library unless you just want to be 'good citizen'.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
I'm compiling a little app that uses the Net*() API functions. For NT/2k/XP, you're supposed to link with Netapi32.lib and include Lm.h, while for Win9x/Me you're supposed to link with Svrapi.lib and include Svrapi.h. Doing both at the same time will cause duplicate linkage and a compile-time error. Is there some sort of macro defined (usage: #ifdef WINNT...) that lets you get around this?
Jon Sagara
What about ?
Sonork ID: 100.9999 jonsagara
|
|
|
|
|
Bah - the point is moot. I don't need to do this after all.
Jon Sagara
What about ?
Sonork ID: 100.9999 jonsagara
|
|
|
|