这是使用G ++ 4.1.2在CentOS 64bit上的C++中.
我们正在编写一个测试应用程序来加载系统上的内存使用量为n千兆字节.这个想法是整个系统负载通过SNMP等进行监控.所以这只是一种执行监控的方法.
然而,我们所看到的只是做:
char* p = new char[1000000000];
Run Code Online (Sandbox Code Playgroud)
不会影响使用top或free -m中显示的内存
一旦内存写入:内存分配似乎变得"真实":
memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB
Run Code Online (Sandbox Code Playgroud)
但是我们必须写入所有内存,只需写入第一个元素就不会显示已用内存的增加:
p[0] = 'a'; //does not show an increase of 1GB.
Run Code Online (Sandbox Code Playgroud)
这是正常的,实际上已经完全分配了内存吗?我不确定它是否是我们正在使用的工具(top和free -m)显示不正确的值,或者在编译器或运行时和/或内核中是否有一些聪明的事情.
即使在关闭优化的调试版本中也可以看到此行为.
我的理解是新的[]立即分配了内存.C++运行时是否会延迟此实际分配,直到稍后访问它为止.在这种情况下,是否可以延迟内存不足,直到实际分配内存直到访问内存为止?
因为它对我们来说不是问题,但是知道它为什么会这样发生会很好!
干杯!
编辑:
我不想知道我们应该如何使用Vectors,这不是OO/C++ /当前的做事方式等等.我只是想知道为什么会发生这种情况,而不是有建议寻找替代方法.
c++ linux memory-management new-operator memory-overcommitment
我一直在寻找这个问题的解决方案太长时间考虑它听起来有多容易,所以我来寻求帮助.
我有一个XML模式,我用它与xjc一起创建我的JAXB绑定.当XML格式良好时,这很好用.不幸的是,当XML格式不正确时,它也不会抱怨.当我尝试解组XML文件时,我无法弄清楚如何对模式进行适当的完全验证.
我设法使用ValidationEventCollector来处理事件,这些事件适用于XML解析错误,例如不匹配的标记,但是当存在需要但完全不存在的标记时不会引发任何事件.
从我所看到的,可以针对模式进行验证,但是您必须知道模式的路径才能将其传递给setSchema()方法.我遇到的问题是架构的路径存储在XML头中,我不能在架构运行时知道.这就是为什么它存储在XML文件中:
<?xml version="1.0" encoding="utf-8"?>
<DDSSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/a/big/long/path/to/a/schema/file/DDSSettings.xsd">
<Field1>1</Field1>
<Field2>-1</Field2>
Run Code Online (Sandbox Code Playgroud)
...等等
我看到的每个示例都使用setValidating(true),现在已弃用,因此抛出异常.
这是我到目前为止的Java代码,它似乎只进行XML验证,而不是模式验证:
try {
JAXBContext jc = new JAXBContext() {
private final JAXBContext jaxbContext = JAXBContext.newInstance("blah");
@Override
public Unmarshaller createUnmarshaller() throws JAXBException {
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
ValidationEventCollector vec = new ValidationEventCollector() {
@Override
public boolean handleEvent(ValidationEvent event) throws RuntimeException {
ValidationEventLocator vel = event.getLocator();
if (event.getSeverity() == event.ERROR || event.getSeverity() == event.FATAL_ERROR) {
String error = "XML Validation Exception: " + event.getMessage() + " at row: …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种以最方便的方式序列化一堆C++结构的方法,以便序列化可以跨C++和Java(至少)以及32位/ 64位,大/小端平台移植.要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象.
我们的想法是将结构序列化为一个八位字节blob,我们可以"存储"在数据库中,并在以后读出.因此,每当结构发生变化时都要避免更改数据库,并且还要避免将每个数据成员分配给字段 - 即我们只希望一个表"一般"将所有内容保存为二进制blob.这应该减少开发人员的工作量,并在结构发生变化时减少更改.
我看过boost.serialize,但不认为有办法实现与Java的兼容性.同样用于继承Java中的Serializable.
如果有一种方法可以通过最好的IDL文件来实现,因为我们已经有了描述结构的IDL文件.
提前干杯!
我正在尝试/etc/fstab使用C++在CentOS安装上编辑该文件.我的想法是,基于另一个配置文件,我将添加fstab中不存在的条目,或者编辑fstab文件中挂载点相同的条目.这使我们可以在初始启动时正确设置系统.
我已找到setmntent()并getmntent()迭代现有条目,因此我可以轻松检查fstab中的条目是否也存在于我的配置文件中.然后我可以使用addmntent()添加任何尚未存在的条目 - 文档中没有说明能够编辑条目,只在文件末尾添加新条目.似乎无法编辑现有条目或删除条目.奇怪的是这个功能不存在,只有CR而不是CRUD的UD.
如果我能帮助它,我宁愿不必编写自己的解析器.
我的另一种选择是:
setmntent()getmentent()并执行任何添加和/或编辑将整个fstab读入内存endmntent()/etc/fstab写作/etc/fstab(从而清空文件)setmntent()addmntent()虽然可能很好,但看起来有点乱.
c++ ×2
linux ×2
filesystems ×1
jaxb ×1
mount ×1
new-operator ×1
schema ×1
validation ×1
well-formed ×1
xml ×1