2015-08-31 35 views
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; 
} 

回答

3

在Python中,您無法刪除正在C++中分配的內存。 你將不得不從C++中導出另一個函數,它將包裝free()/ delete調用,並從python調用它。

作爲題外話,請記住,Python是使用UTF-16和C++可被使用UTF-8,和一些串轉換將需要(CTYPE可以正常執行此)

+0

我已經更新我的代碼。請看看它..只是建議我如果做錯了 –

+0

請啓用所有警告編譯,並使用像valgrind工具來檢查內存泄漏。 – vrdhn