const char* and std::string problem with .net (works with 6.0)

  • Thread starter anelma via .NET 247
  • Start date
A

anelma via .NET 247

Following code works fine, when compiled with VS 6.0, but not anymore when compiled in .NET. What's wrong here, I can't see it by myself?
arrString content will be garbage with .net compilation, but when compiled with 6.0 it contains string from Vector (that's how I want it to work).

std::vector<std::string> Vector;
...

void MyClass::DoThis(std::vector<std::string> Vector)
{
const char *arrString[10];

for (int i = 0; i < 10 && i < Vector.size(); i++)
arrString = Vector.c_str();


When I debug these, I see that the problem is with my array of const char*. Const char* items seems to change, when std:string changes. For example,
Vector[0].c_str = "dog"
arrString[0]="dog"
Vector[1].c_str = "cat"
arrString[0]="cat" --> this is the problem, why it happens?
This happens only with .net, with 6.0 remains arrString[0] = "dog"
 
A

Ary Sulistyono

Using VS.Net 2003, I don't see the problem you're seeing.

void
MyChass::DoSomething(vector<string> v)
{
const char *arr[10];
for (int i = 0; i < 10 && i < v.size(); i++)
{
arr = v.c_str();
}

// this will print "dog" and "cat" correctly
for (int j=0; j < 10 && j < v.size(); j++)
{
cout << "arr[" << j << "] = " << arr[j] << endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
MyChass m;
std::string s1 = "dog";
std::string s2 = "cat";
std::vector<std::string> v;
v.push_back(s1);
v.push_back(s2);
m.DoSomething(v);
return 0;
}

Ary Sulistyono
 
V

Vladimir Nesterovsky

anelma via .NET 247 said:
Following code works fine, when compiled with VS 6.0, but not anymore when
compiled in .NET. What's wrong here, I can't see it by myself?
arrString content will be garbage with .net compilation, but when compiled
with 6.0 it contains string from Vector (that's how I want it to work).
std::vector<std::string> Vector;
..

void MyClass::DoThis(std::vector<std::string> Vector)
{
const char *arrString[10];

for (int i = 0; i < 10 && i < Vector.size(); i++)
arrString = Vector.c_str();


When I debug these, I see that the problem is with my array of const

char*. Const char* items seems to change, when std:string changes. For
example,
Vector[0].c_str = "dog"
arrString[0]="dog"
Vector[1].c_str = "cat"
arrString[0]="cat" --> this is the problem, why it happens?
This happens only with .net, with 6.0 remains arrString[0] = "dog"

std::string owns memory returned with c_str(). Destiny of this memory is
implementation defined when string is changed.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top