Возможно, вам лучше написать код, подобный следующему:
int
Tcl_AppInit( Tcl_Interp* interp )
{
if ( Tcl_Init( interp ) == TCL_ERROR ) {
return TCL_ERROR;
}
for ( int i = 1; i < argc; ++i ) {
std::string script("source ");
script += argv[i];
if ( Tcl_Eval( interp, script.c_str() ) == TCL_ERROR ) {
return TCL_ERROR;
}
}
return TCL_OK;
}
Таким образом, время жизни буфера в std::string
будет правильным, что, как указывает моя интуиция, вероятно, является вашим реальнымпроблема.(После того, как память испорчена, сбой может произойти почти в любом месте.) Однако вы также должны знать, что это все равно будет идти неправильно, если у вас есть пробелы в любом из этих имен файлов.Может быть, это нормально для вас (например, если это все локальные имена файлов с «хорошими» именами), но в противном случае используйте Tcl Tcl_EvalObjv
, чтобы выполнить выполнение, как это (что немного длиннее; это действительно C,не C ++):
int
Tcl_AppInit( Tcl_Interp* interp )
{
Tcl_Obj *script[2];
int code = TCL_OK;
if ( Tcl_Init( interp ) == TCL_ERROR ) {
return TCL_ERROR;
}
script[0] = Tcl_NewStringObj("source", -1);
Tcl_IncrRefCount(script[0]);
for ( int i = 1; i < argc && code == TCL_OK; ++i ) {
script[1] = Tcl_NewStringObj(argv[i], -1);
Tcl_IncrRefCount(script[1]);
if (Tcl_EvalObjv(interp, 2, script, 0/*no special flags*/) != TCL_OK) {
code = TCL_ERROR;
}
Tcl_DecrRefCount(script[1]);
}
Tcl_DecrRefCount(script[0]);
return code;
}