Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / Managed C++ / August 2004

Tip: Looking for answers? Try searching our database.

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

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
anelma - 31 Aug 2004 06:35 GMT
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[i] = Vector[i].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"   
Ary Sulistyono - 31 Aug 2004 09:05 GMT
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[i] = v[i].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

> 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).
[quoted text clipped - 22 lines]
>
> <Id>FCPH9ioddE2faW+WEvjukQ==</Id
Vladimir Nesterovsky - 31 Aug 2004 09:34 GMT
> 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).
[quoted text clipped - 10 lines]
>
> 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.
Signature

Vladimir Nesterovsky
e-mail: vladimir@nesterovsky-bros.com
home: www.nesterovsky-bros.com


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.