0
我使用基於C++的庫,其返回類型是char指針。我在Python中調用了這個C++函數。python中允許字符指針嗎?
我的問題是,我可以從Python中刪除C++函數中分配的內存嗎?
Python代碼
lib.TagGetName.restype = c_char_p
lib.TagGetName.argtypes=[c_int]
data = 1
cmt = (b"this is comment for Voltage")
result = lib.TagGetName(data)
Python的輸出
Kernel process terminated for restart. (0)
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) on Windows (32 bits).
This is the IEP interpreter.
Type 'help' for help, type '?' for a list of *magic* commands.
運行腳本: 「d:\ QTDev \ test.py」
1
SELECT sTagName FROM TagDataInfo where iTagId = 1;
Return value--> b'Voltage\xfd\xfd\xfd\xfd\xdd`\x18x'
print ("Return value-->" , result)
C++功能代碼
USE_MATH char* TagGetName(int iTagId)
{
char* cName;
//string cName = "";
sqlite3_stmt *stmtCreate = NULL;
sqlite3 *m_pdbObj;
cout<<iTagId<<endl;
if (sqlite3_open_v2("D:\\QTDev\\forPythonDLL\\Neha_Test_Use\\TagData", &m_pdbObj, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK)
{
return cName;
}
char cQuery[1024] = {0};
sprintf(cQuery,"SELECT sTagName FROM TagDataInfo where iTagId = %d;",iTagId);
cout<<cQuery<<endl;
if (sqlite3_prepare_v2(m_pdbObj, cQuery, -1, &stmtCreate, 0) == SQLITE_OK)
{
sqlite3_step(stmtCreate);
if(sqlite3_column_text(stmtCreate, 0))
{
cName = new char[strlen((char*)sqlite3_column_text(stmtCreate, 0))+1];
memset(cName,0x00,(strlen((char*)sqlite3_column_text(stmtCreate, 0))+1));
memcpy(cName,(char*)sqlite3_column_text(stmtCreate, 0),strlen((char*)sqlite3_column_text(stmtCreate, 0)));
cout<<"Cname="<<cName<<endl;
cout<<"Database Name="<<(char*)sqlite3_column_text(stmtCreate, 0)<<endl;
}
sqlite3_finalize(stmtCreate);
}
else
{
return cName;
}
sqlite3_exec(m_pdbObj, "COMMIT", 0, 0, 0);
return cName;
}
我已經更新我的代碼。請看看它..只是建議我如果做錯了 –
請啓用所有警告編譯,並使用像valgrind工具來檢查內存泄漏。 – vrdhn