2017-04-11 11 views
1

C++で書かれたMySQL UDFを実行しようとしています。正常にコンパイルされ、正しい出力が生成されますが、出力後に多くのジャンクが生成されます。私はこの迷惑の理由を知りたいのですが、どうすればこの問題を解決できますか?私は自分のコードと出力のスクリーンショットを添付しました。C++でMySQLユーザ定義関数

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <cstdlib> 
#include <cstdio> 
#include <cstring> 
#include "mysql-connector-c-6.1.9-linux-glibc2.5-x86_64/include/mysql.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/mysql_connection.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/sqlstring.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/resultset.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/datatype.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/resultset.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/resultset_metadata.h" 
#include "mysql-connector-c++-1.1.8-linux-ubuntu16.04-x86-64bit/include/cppconn/exception.h" 

using namespace std; 

extern "C" { 
    char *hello_world (UDF_INIT *initid, UDF_ARGS *args,char *result, unsigned long length,char *is_null, char *error); 
    my_bool hello_world_init (UDF_INIT *initid, UDF_ARGS *args, char *message); 
    void hello_world_deinit (UDF_INIT *initid); 
    //template <typename T> T adder (UDF_INIT *initid, UDF_eARGS *args,string result, unsigned long length,string is_null, string error,T v); 
} 

char *hello_world (UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long length, char *is_null, char *error) 
{ 
    string res; 
    res = args->args[0]; 
    res.append(" hello"); 
    char *c = new char[res.size()]; 
    strcpy(c, res.c_str()); 
    return c; 
} 

my_bool hello_world_init (UDF_INIT *initid, UDF_ARGS *args, char *message) 
{ 
    return 0; 
    //cout<<"success"<<endl; 
} 

void hello_world_deinit (UDF_INIT *initid) 
{ 
    return; 
} 

enter image description here

+0

結果として割り当てる配列が小さすぎます。終了するゼロのために1つのcharを追加する必要があります: 'new char [res.size()+ 1]'。 –

+0

結果に割り当てるバッファによってメモリリークが発生します。 'xxx_init'と' xxx_deinit'関数でメモリを管理する必要があります:結果を格納するバッファをあらかじめ割り当てて、後で解放してください。 –

答えて

2

hello_world関数の署名が間違っています。第四パラメータが

unsigned long *length 

されるべきであることをポインタによって指された値が返される文字列の長さに設定されなければなりません。

char *c = new char[res.size() + 1]; 
strcpy(c, res.c_str()); 
*length = res.size(); 
return c; 
+0

上記の編集で感謝した@Marvin –