小编fwg*_*wgx的帖子

new []在填充之前不会减少可用内存

这是使用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

13
推荐指数
2
解决办法
435
查看次数

使用JAXB验证架构

我一直在寻找这个问题的解决方案太长时间考虑它听起来有多容易,所以我来寻求帮助.

我有一个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)

xml validation schema jaxb well-formed

12
推荐指数
1
解决办法
2万
查看次数

跨平台和语言(de)序列化

我正在寻找一种以最方便的方式序列化一堆C++结构的方法,以便序列化可以跨C++和Java(至少)以及32位/ 64位,大/小端平台移植.要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象.

我们的想法是将结构序列化为一个八位字节blob,我们可以"存储"在数据库中,并在以后读出.因此,每当结构发生变化时都要避免更改数据库,并且还要避免将每个数据成员分配给字段 - 即我们只希望一个表"一般"将所有内容保存为二进制blob.这应该减少开发人员的工作量,并在结构发生变化时减少更改.

我看过boost.serialize,但不认为有办法实现与Java的兼容性.同样用于继承Java中的Serializable.

如果有一种方法可以通过最好的IDL文件来实现,因为我们已经有了描述结构的IDL文件.

提前干杯!

language-agnostic serialization cross-platform

11
推荐指数
4
解决办法
7803
查看次数

在C++中编辑/ etc/fstab条目

我正在尝试/etc/fstab使用C++在CentOS安装上编辑该文件.我的想法是,基于另一个配置文件,我将添加fstab中不存在的条目,或者编辑fstab文件中挂载点相同的条目.这使我们可以在初始启动时正确设置系统.

我已找到setmntent()getmntent()迭代现有条目,因此我可以轻松检查fstab中的条目是否也存在于我的配置文件中.然后我可以使用addmntent()添加任何尚未存在的条目 - 文档中没有说明能够编辑条目,只在文件末尾添加新条目.似乎无法编辑现有条目或删除条目.奇怪的是这个功能不存在,只有CR而不是CRUD的UD.

如果我能帮助它,我宁愿不必编写自己的解析器.

我的另一种选择是:

  • 使用打开文件 setmntent()
  • 使用getmentent()并执行任何添加和/或编辑将整个fstab读入内存
  • 使用关闭文件 endmntent()
  • 开放/etc/fstab写作
  • 关闭/etc/fstab(从而清空文件)
  • 使用打开fstab setmntent()
  • 循环我之前读过的条目并使用它们写出来 addmntent()

虽然可能很好,但看起来有点乱.

c++ linux filesystems mount

2
推荐指数
1
解决办法
1117
查看次数