C++11 通过函数外的指针访问return
我有以下功能C++11 通过函数外的指针访问return,c++11,C++11,我有以下功能 std::tuple<int,val*>Socket::recv(val* values ) // const { char buf [ MAXRECV + 1 ]; memset ( buf, 0, MAXRECV + 1 ); int status = ::recv ( m_sock, buf, MAXRECV, 0 ); if ( status == -1 ) { std::cout << "status == -1
std::tuple<int,val*>Socket::recv(val* values ) // const
{
char buf [ MAXRECV + 1 ];
memset ( buf, 0, MAXRECV + 1 );
int status = ::recv ( m_sock, buf, MAXRECV, 0 );
if ( status == -1 )
{
std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
// return std::make_tuple(0,NULL);//this is not working
}
else if ( status == 0 )
{
//return std::make_tuple(0,NULL); //this is not working
}
else
{
struct val* values=(struct val*) buf;
if(!std::isnan(values->val1) &&
!std::isnan(values->val2) &&
!std::isnan(values->val3) &&
!std::isnan(values->val4),
!std::isnan(values->val5),
!std::isnan(values->val6))
printf("received:%f %f %f %f %f %f\n", values->val1, values->val2,
values->val3, values->val4, values->val5, values->val6);
return std::make_tuple(status,values);
}
}
调用函数或访问结构val的所有三个选项对我都不起作用
你能告诉我吗
val* nullval = nullptr;
return std::make_tuple(0, nullval);
或
选择一个对您来说更清晰的选项。您很幸运,外部功能正在打印零。它还不如把核心扔给你:) 您要做的是在释放堆栈后(函数执行完成后)访问在堆栈上创建的缓冲区。这是非常不安全的,而且几乎是非法的 相反,您应该做的是在“空闲内存”中分配数据缓冲区,使用类似于
malloc
(在C++中)或operatornew/new[]
(在C++中)的函数
快速修复方法是更换线路
char buf [ MAXRECV + 1 ];
与
当你在网上进行打字时
struct val* values=(struct val*) buf;
你确实应该确保你所做的是正确的。如果你的sizeof()
结构val大于sizeof(char[MAXRECV+1])
你会遇到内存访问问题
使用完返回的数据缓冲区后,不要忘记调用
free
(C语言)或delete/delete[]
(C++语言)来释放它。否则,您将出现所谓的内存泄漏。请编辑您的问题并重新进行标记。请格式化您的代码。我如何格式化您的代码,但为了将来,请使用合适的编辑器和代码格式化。此外,我非常确定,您列出的三种方式甚至都不是全部编译的,这应该说明一些问题。更不用说您是将指针指向堆栈中为函数分配的内存块,该内存块在返回后不可用。除了代码不起作用,而且您很幸运得到zeores之外,您遇到的具体语法问题是元组的类型推断无法通过查看返回值推断类型,请参阅我的回答在写你的答案时,别忘了审核它是否使用了任何人都不应该使用的极其不安全的语言功能。返回{0.nullptr}的建议工作正常。但我仍然无法使用new/delete访问函数外的接收值。有人能帮我吗?我浪费了很多时间。我的项目死线即将到来。@Puppy-你能不能把讽刺放在一边,用直接语言告诉我你在说什么?非常感谢你的关注n、 @YePhIcK:接收到的数据在函数内部正确打印,但仍然无法通过调用从外部检索。是否缺少一些细节?@Tadeleta-仍然在谜语中说话:)而在函数内部,char buf[]
在堆栈上分配的当然仍然有效且可访问。一旦函数退出,指针就不再有效。您能告诉我我的逻辑在哪里失败吗?std::make_tuple
并不意味着使用显式指定的类型模板参数调用make_tuple来推断类型。因为返回类型已经定义,'return{0,nullptr};'更好。很好的建议John:)(有可能它对我也有用)
struct val {
val1;
val2;
val3;
val4;
val5;
val6;} values;
return std::make_tuple<int, val*>(0, nullptr);
static_cast<val*>(NULL);
val* nullval = nullptr;
return std::make_tuple(0, nullval);
return std::make_tuple(0, static_cast<val*>(nullptr));
return {0, nullptr};
char buf [ MAXRECV + 1 ];
char * buf = new char [ MAXRECV + 1 ];
struct val* values=(struct val*) buf;