从函数返回一个指针

时间:2015-12-24 04:49:29

标签: c++ pointers

我只是在寻找一个正确的语法来从函数中返回指针并感到惊讶。

搜索产生了很多这样的代码:

void A::foo(int *ptr)
{
    ptr = 5 + ptr;
}

int main()
{
    int b = 5;
    A a;
    a.foo( b );
}

但是,我相信这段代码不会像以前一样工作。是一个局部变量,当它超出范围时将被销毁。

那么,从函数返回指针的正确方法是什么?像这样的代码:

SQLWCHAR *CODBCConfigure::ConvertFromString(const wxString &str)
{
    SQLWCHAR *string = new SQLWCHAR[str.length() * sizeof( SQLWCHAR )];
    string = const_cast<SQLWCHAR *>( str.wc_str() );
    SQLWCHAR *ret = string;
    return ret;
}

所以我错了?

EDIT1:

我刚刚尝试了Aiman建议的代码,它确实有效。这意味着简单(标准)类型有效。

但是,我需要使用以下代码:

SQLWCHAR *tmp = const_cast<SQLWCHAR *>( str.wc_str() );
SQLWCHAR *string = new SQLWCHAR[sizeof( tmp ) * sizeof( SQLWCHAR )];
memcpy( string, tmp, sizeof( tmp ) );
return string;

尝试执行此代码时,我看到ret指针仍然指向正确的地址但是那里的值变得错误。

EDIT2:

这是我最新的代码:

response = table.update_item(
    Key={
        'ReleaseNumber': releaseNumber,
        'Timestamp': result[0]['Timestamp']
    },
    UpdateExpression="set Sanity = :r",
    ExpressionAttributeValues={
        ':r': 'false',
    },
    ReturnValues="UPDATED_NEW"
)

不幸的是,此代码也失败了。字符串指针不包含正确的数据。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

试试这个,

void A::foo(int *ptr)
{
    *ptr = 5 + *ptr;
}

int main()
{
    int b = 5;
    A a;
    a.foo( &b );
}

无论何时收集指针,请确保传递地址而不是变量本身,指针需要一个地址而不是值,并且您需要更新指针引用的值,您只是在尝试增加指针本身。

答案 1 :(得分:0)

如果你坚持要返回一个指向即使在函数范围之外仍然存在的东西的指针,那么动态分配你的数字:

int *A::foo()
{
    int *b;
    b = new int(5);
    int *c = b;
    return c;
}

请注意,之后您需要使用b自行删除delete pointer_variable

如果您不在乎,我建议通过引用传递该值:

//ampers and means ptr will be 'passed by reference'
void A::foo(int &ptr) //so changing ptr now changes the variable you passed itself
{
    ptr = 5 + ptr; // it isn't a pointer anymore, so better call it "ref"
}

编辑:

SQLWCHAR *CODBCConfigure::ConvertFromString(const wxString &str)
{
    SQLWCHAR *string = new SQLWCHAR[str.length() * sizeof( SQLWCHAR )];
    string = const_cast<SQLWCHAR *>( str.wc_str() );
    SQLWCHAR *ret = string;
    return ret;
}

1-Don不要将变量命名为string,因为这可能会导致冲突。例如:在您的情况下,如果您包含<string>标题和using namespace std;

2 - 您在第二次分配内容后立即重新定义string,这是毫无意义的。更糟糕的是,它会导致内存泄漏,因为你已经在第一行分配了内存并且没有释放它(使用`delete&#39;)需要释放任何分配有new的内存

3 - 永远不要指示函数返回的内容,因为当你这样做时,你将获取动态创建的临时变量的指针,并在你离开该行时被释放。您应该首先将它分配给由new分配的永久内存位置,并且由于您复制的内容本质上是一个数组,因此您需要复制整个内容。我一般不熟悉SQLWCHAR或wstrings,但memcopy之类的东西可以帮助你。试试这个:

SQLWCHAR *CODBCConfigure::ConvertFromString(const wxString &str)
{
    SQLWCHAR *ret = new SQLWCHAR[str.length() * sizeof( SQLWCHAR )];
    SQLWCHAR *tmp = str.wc_str();
    memcopy(ret, temp, sizeof(tmp)); //probably str.length()+1 is what you need        
    //SQLWCHAR *ret = string; this line is redundant
    return ret;
}

答案 2 :(得分:0)

您通过

覆盖已分配内存的ptr
SQLWCHAR *string = new SQLWCHAR[str.length() * sizeof( SQLWCHAR )];

然后

string = const_cast<SQLWCHAR *>( str.wc_str() );

使用循环从字符串或某种不同方法复制字符。