C++ C++;在Linux中重新解释\u cast内核,但在MAC中运行succee
在某些情况下,我希望malloc是一个块内存,例如:内存的第一部分将包含字符串,第二部分将包含长类型数据。因此,我尝试下面的演示代码 下面的代码可以在MAC中成功运行,但在Linux中内核转储 valgrind res: 其中:C++ C++;在Linux中重新解释\u cast内核,但在MAC中运行succee,c++,reinterpret-cast,C++,Reinterpret Cast,在某些情况下,我希望malloc是一个块内存,例如:内存的第一部分将包含字符串,第二部分将包含长类型数据。因此,我尝试下面的演示代码 下面的代码可以在MAC中成功运行,但在Linux中内核转储 valgrind res: 其中: 第7行是:str[0]=key.data() 第13行是test_缓存(缓存,“test”) #包括 #包括 #包括 #包括 无效测试_缓存(字符*缓存,标准::字符串键){ std::string*str=reinterpret_cast(缓存); str[0]=k
str[0]=key.data()代码>
test_缓存(缓存,“test”)代码>
#包括
#包括
#包括
#包括
无效测试_缓存(字符*缓存,标准::字符串键){
std::string*str=reinterpret_cast(缓存);
str[0]=key.data();
}
int main()
{
char*cache=reinterpret_cast(calloc(1000,1));
测试缓存(缓存,“测试”);
std::string*str=reinterpret_cast(缓存);
printf(“%s\n”,str[0].c_str());
免费(缓存);
}
<> >请阅读一个好的,然后看到和你的C++编译器(也许)和调试器(例如)的文档。你在使用中是正确的,但是当然你应该阅读它的文档(也考虑使用,并且注意)。
我的建议是在编译C++代码时启用所有警告和调试信息。
<> P>使用GC>G++WALL-WOTH-G/<代码>编译C++代码。
在C++中,使用动态内存分配的最常用方式是不使用“代码> > Malc C/代码>和<代码>免费< /代码>函数,但要使用。在某些情况下,您可以重新定义新的。但是,请注意,这是一个优秀的编码规则
实践中,在几个C++实现中,<代码>新< /COD>在调用构造函数之前可能调用<代码> MalOC >调用Debug > >代码>调用析构函数后,可以调用<代码>自由<代码>。当
malloc
失败时,new
应引发异常
有关更多详细解释,请参见报告,重点介绍最近的GCC(如2020年夏季)
<>在C++中,你想利用强大的标准C++库,所以使用字符串,学习使用和./P>
或
害怕C++11标准(或更高版本的标准),以后再阅读
考虑在整个C++程序中使用静态源代码分析器,如++或。如果允许使用,考虑使用,或编写自己的静态分析的目的。如果在2020年夏季,您的GCC大于GCC 10,请执行(在获得经理或客户的许可后)。当然,编写GCC插件可能需要几个月的工作,所以对于大型C++程序来说是值得的。
std::string
的实现详细信息。如果使用字符串指针而不构建字符串对象,则会出现未定义的行为。未定义意味着任何事情都可能发生,包括看起来正常工作。但是你永远也不能指望它。你的程序表现出未定义的行为,在对象的生命周期开始之前访问对象。“似乎有效”是未定义行为的一种可能表现形式;崩溃是另一个原因<代码>缓存
不包含std::string
的实例。我明白了,非常感谢你的专业回答和建议,我会继续学习,非常感谢
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
void test_cache(char *cache, std::string key) {
std::string* str = reinterpret_cast<std::string*> (cache);
str[0] = key.data();
}
int main()
{
char *cache = reinterpret_cast<char *> (calloc(1000, 1));
test_cache(cache, "test");
std::string* str = reinterpret_cast<std::string*> (cache);
printf("%s\n",str[0].c_str());
free(cache);
}
std::string* str = reinterpret_cast<std::string*> (cache);
auto str = new std::string(cache);
std::string str(cache);