C++ cannot convert parameter 1 from 'const char *' to 'char *' -
i'm not c++ developer @ all, giving task of upgrading old code visual studio 6 visual studio 2010. i'm getting error following code.
messagegroup::messagegroup(const char *name, wordcollection *words) { _name.assign(_strupr(name)); setwordcollection(words); }
error:
error c2664: '_strupr' : cannot convert parameter 1 'const char *' 'char *'
name
constant c-style string. promises function's caller provided string not modified inside messagegroup
constructor or functions called messagegroup
.
_strupr(name) going convert
name` upper case, violating no-modifications promise. bad thing do, possibly impossible memory region holding name may not writable, , generates error. perhaps in past generated warning , ignored. not on visual c 6 , it's default settings, or project settings should defaults have been changed silence warnings, i'm not sure if ever saw warning.
solutions problem are:
1. modify messagegroup
remove const
messagegroup::messagegroup(char *name, wordcollection *words)
this may break untold other pieces of code use messagegroup
, count on name passing through unchanged. suggest because it's easy thing try. if blows up, put const
, move on.
2. copy name
new memory buffer writable.
char * temp = new char[strlen(name)]; _name.assign(_strupr(temp)); delete temp;
but consider smart pointer instead because self-manages memory should bad things happen.
std::unique_ptr<char[]> temp(new char[strlen(name)]) _name.assign(_strupr(temp.get));
the nastiness here not know lifespan of name
. responsible delete
ing temp
's memory when you're done it? if _name.assign
copies pointer opposed making , keeping copy of data, messagegroup
cannot clean-up because _name
contain invalid pointer. if _name
keeps copy, you're safe, have performance hit of copy.
modifications _name.assign
, whatever class _name
instantiates may required.
3. sizable rip-up
rewrite program modern techniques , std::string
. error you've run across shows wasn't being careful memory use , there other time bombs waiting go off.
this out of scope stack overflow.
Comments
Post a Comment