C++ c++;释放数组指针的内存

C++ c++;释放数组指针的内存,c++,C++,我有一个如下的函数 void ReadMyPacket(int Socket) { char *inStartup = new char[2]; int recvReturn = recv(Socket, inStartup, 2, 0); ... ... delete[] inStartup; } 如何释放inStartup的内存?我不能使用std::string,因为我必须在recv函数中传递数组。这应该足以释放内存 delete[] inStartup; dele

我有一个如下的函数

void ReadMyPacket(int Socket)
{
  char *inStartup = new char[2];
  int recvReturn = recv(Socket, inStartup, 2, 0);
  ...
  ...
  delete[] inStartup; 
}

如何释放inStartup的内存?我不能使用std::string,因为我必须在recv函数中传递数组。

这应该足以释放内存

delete[] inStartup;
delete[] inStartup;
然而,如果您要将它包含在函数中,并且它不是很大,您最好使用堆栈,它会更快,并且不需要释放

char inStartup[2];

这应该足以释放内存

delete[] inStartup;
delete[] inStartup;
然而,如果您要将它包含在函数中,并且它不是很大,您最好使用堆栈,它会更快,并且不需要释放

char inStartup[2];

这是正确地删除内存

delete[] inStartup;
delete[] inStartup;
变戏法

new []

这是正确地删除内存

delete[] inStartup;
delete[] inStartup;
变戏法

new []

2个字符缓冲区的动态分配过于苛刻-只需在堆栈上使用本地缓冲区即可:

void ReadMyPacket(int Socket)
{
  char inStartup[2];
  int recvReturn = recv(Socket, inStartup, 2, 0);
  ...
  ...
  // nothing to dispose of here
}

2个字符缓冲区的动态分配过于苛刻-只需在堆栈上使用本地缓冲区即可:

void ReadMyPacket(int Socket)
{
  char inStartup[2];
  int recvReturn = recv(Socket, inStartup, 2, 0);
  ...
  ...
  // nothing to dispose of here
}

你有正确的语法,但是你的推理有点缺陷:

我不能使用
std::string
,因为我必须在
recv
函数中传递数组

虽然
string
可能不是正确的接口,
vector
肯定是。
vector
是连续数组的主要原因是与C的互操作性

你可以这样写:

void ReadMyPacket(int Socket)
{
  std::vector<char> inStartup(2);
  int recvReturn = recv(Socket, &inStartup.at(0), inStartup.size(), 0);
  //...
  //...

}
void ReadMyPacket(int套接字)
{
std::vector inStartup(2);
int recvReturn=recv(插座和inStartup.at(0),inStartup.size(),0);
//...
//...
}
这样,您将避免忘记自己调用
delete[]
的风险(例如,在异常情况下)


注意:在C++11及更高版本中,您可以使用
inStartup.data()
而不是
&inStartup.at(0)

语法正确,但是您的推理有点缺陷:

我不能使用
std::string
,因为我必须在
recv
函数中传递数组

虽然
string
可能不是正确的接口,
vector
肯定是。
vector
是连续数组的主要原因是与C的互操作性

你可以这样写:

void ReadMyPacket(int Socket)
{
  std::vector<char> inStartup(2);
  int recvReturn = recv(Socket, &inStartup.at(0), inStartup.size(), 0);
  //...
  //...

}
void ReadMyPacket(int套接字)
{
std::vector inStartup(2);
int recvReturn=recv(插座和inStartup.at(0),inStartup.size(),0);
//...
//...
}
这样,您将避免忘记自己调用
delete[]
的风险(例如,在异常情况下)


注意:在C++11及更高版本中,您可以使用
inStartup.data()
而不是
&inStartup.at(0)

使用它的方式有什么问题?更好的是,只要使用堆栈,就不必担心它。如果需要,可以使用
shared\u ptr
。聪明的指针对你有好处。正如@Cyber所提到的,它没有什么问题,除非你打算用它做更多的事情(告诉我们是什么)。当我第二次调用这个函数时,它崩溃了,即使我在代码中只有这3行,其他所有内容都被注释了,所以我想这可能是内存问题。你使用它的方式有什么问题?更好的是,只要使用堆栈,就不必担心它。如果需要,可以使用
shared\u ptr
。聪明的指针对你有好处。正如@Cyber提到的,它没有任何问题,除非你打算用它做更多的事情(告诉我们是什么)。当我第二次调用这个函数时,它崩溃了,即使我的代码中只有这3行,其他所有内容都被注释了,因此我认为这可能是内存问题。您可以使用新的
std::vector::data()
函数而不是
&inStartup.at(0)
@sjdowling:啊,对了,我一直忘了这一行。您可以使用新的
std::vector::data())
函数而不是
&inStartup.at(0)
@sjdowling:啊,对了,我一直忘了那一个。如果没有一个常量表达式,这个怎么工作?例如,如果我有一个变量而不是2,那么您可能希望使用动态分配,但是您的示例使用了硬编码常量(2)作为大小。如果没有常量表达式,这将如何工作?例如,如果我有一个变量而不是2,那么您可能希望使用动态分配,但是您的示例使用了硬编码常量(2)作为大小。