初始化const-char*,去掉任何内存泄漏
Initialize const char * with out any memory leaks
下面是我的示例代码。这只是一个示例,与我在应用程序中使用的代码相似。
#define STR_SIZE 32
void someThirdPartyFunc(const char* someStr);
void getString(int Num, const char* myStr)
{
char tempStr[] = "MyTempString=";
int size = strlen(tempStr) + 2;
snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}
int main()
{
const char * myStr = new char(STR_SIZE);
getString(1, myStr); // get the formated string by sending the number
someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction
delete myStr;
return 0;
}
如果使用此代码,则会出现异常。我认为问题在于删除"myStr"。但删除确实是必要的。
有没有其他方法可以格式化getString中的字符串并将其发送到ThirdPartyFunc??
提前谢谢。
您分配的不是一个字符数组,而是一个带有以下行的字符:
const char * myStr = new char(STR_SIZE);
并且一个分配的字符被初始化为STR_SIZE
的值,在这种情况下会导致"字符溢出"。
如果您想要STR_SIZE
:大小的数组
const char * myStr = new char[STR_SIZE];
(注意矩形[])。您必须使用delete[]
运算符来释放这样分配的内存块。
个人注意:你上面写的代码(手动分配字符串等)是很好的教育智慧;你会犯很多这样的错误,从而了解C/C++的内部工作原理。对于您不想要的生产代码,对于您想要std::string
或其他字符串容器以避免重复出现与字符串相关的错误的生产代码。一般来说,您并不是成功地重新设计字符串库工作方式的人。其他容器类型也是如此,如动态可增长数组(std::vector
)或字典类型或其他类型。但对于教育来说,篡改上面的代码是有好处的。
代码片段中还有其他问题(将const char*
交给一个函数,然后修改ram,在调用snprintf
时没有正确计算size
参数等),但这些问题与segfault问题无关。
关于技术,而不是
const char * myStr = new char(STR_SIZE);
进行
char const myStr[STR_SIZE] = "";
请注意,两者都有一个问题,即字符串可以&rsquo的;不得修改。
但您只询问了分配/解除分配问题。
但是,在语言技术层面上有太多的错误。
这是原始代码,完整:
void someThirdPartyFunc(const char* someStr);
void getString(int Num, const char* myStr)
{
char tempStr[] = "MyTempString=";
int size = strlen(tempStr) + 2;
snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}
int main()
{
const char * myStr = new char(STR_SIZE);
getString(1, myStr); // get the formated string by sending the number
someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction
delete myStr;
return 0;
}
以下是如何在C++级别上做到这一点:
#include <string> // std::string
#include <sstream> // std::ostringstream
using namespace std;
void someThirdPartyFunc( char const* ) {}
string getString( int const num )
{
ostringstream stream;
stream << "MyTempString=" << num;
return stream.str();
}
int main()
{
someThirdPartyFunc( getString( 1 ).c_str() );
}
#define
从更自然的代码中消失了,但请注意,即使使用全大写的宏名称,它也很容易导致不需要的文本替换。无论如何,喊出所有大写字母都是一种眼中钉(这就是为什么它是宏名称约定,而不是其他约定)。在C++中,只需使用const
即可。
- 尝试摆脱任何堆内存分配
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 指针可以用于访问内存中的任何任意区域吗?
- QaudioOutput代码是否有任何内存泄漏
- Do C 参考需要任何内存
- 此代码中是否有任何内存泄漏
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 如何在c++中声明变量我不想定义它,所以它不应该只消耗声明中的任何内存
- 从任何内存地址读取UInt32的最有效方法
- 阻止向特定应用程序注入任何内存或DLL文件
- Valgrind 没有检测到任何内存泄漏。这有多安全?
- 在C/ c++中通过int main()返回0,在任何操作系统上,清除程序在任何(RAM,缓存或任何…)内存中使用的所有
- 函数中是否有任何内存泄漏,如function(new Foo())
- 我可以读取任何内存值吗
- 初始化const-char*,去掉任何内存泄漏