小编Ant*_*nts的帖子

在C++标准中它说的是什么:: delete可以改变左值?

我遇到了第一个改变传递给:: delete的左值的编译器,但没有将左值归零.这是以下情况:

 Foo * p = new Foo();
 Foo * q = p;
 assert(p != 0);
 assert(p == q);
 ::delete p;
 assert(p != q);
 assert(p != 0);
Run Code Online (Sandbox Code Playgroud)

请注意,删除操作后p不为零,并且已从其旧值更改.一位同事告诉我,他在使用一些将p改为0xFFFFFFFF的大型机C++编译器以及将p改为0的其他编译器的经验并不罕见.

在C++标准中,它是否允许编译器执行此操作?

通过StackOverflow搜索,我发现了这个问题:为什么不删除将指针设置为NULL?有一个答案提到Bjarne Stroustrup的答复,其中包括声明:

C++显然允许delete的实现将左值操作数归零,我曾希望实现会这样做,但这个想法似乎并没有受到实现者的欢迎.

我已经阅读并重新阅读了最终委员会草案C++ 0x标准的第5.3.5和12.5节,但我没有看到"明确"部分.我只是在寻找标准的错误部分吗?或者这些部分中是否存在一系列逻辑,但我只是没有正确连接在一起.

我没有Annotated C++ Reference Manual的副本了.编译器是否可以在ARM中执行此操作?

[编辑:将部分参考从3.5.3更正为5.3.5.我还添加了一个有趣的悖论作为Henk断言删除后p未定义的对立点.

如果将p初始化为null,则存在一个有趣的悖论.

 Foo * p = 0;
 Foo * q = p;
 assert(p == 0);
 assert(p == q);
 ::delete p;
 assert(p == q);
 assert(p == 0);
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,行为已有详细记录.当delete获得一个空指针时,它假设什么也不做,所以p保持不变.

c++ pointers lvalue delete-operator c++11

8
推荐指数
1
解决办法
627
查看次数

如何在一个Tomcat实例下运行Jenkins的多个实例?

在Windows 2008 R2上,我安装了最新的64位JRE和Tomcat 7.0.我试图在这个单一的Tomcat实例中托管两个Jenkins实例.我在conf/Catalina/localhost /文件夹中创建了上下文描述符文件,以便将JENKINS_HOME设置为每个实例的不同主目录.为了部署Jenkins的实例,我下载了Jenkins的LTS版本,命名为一个蝙蝠侠,另一个命名为Robin.

我所看到的是我可以毫无问题地使用/管理一个实例,但如果我尝试在另一个选项卡中使用/管理另一个实例,看起来Tomcat只是占用了大约25%的CPU和内存使用量攀登.查看Tomcat目录中的日志文件,我没有看到任何文件增长或正在更新.

更糟糕的是,如果我添加第三个实例Joker,访问Tomcat主页没有问题,但我无法访问任何3个实例.

有没有正确的方法在Tomcat中托管Jenkins的多个实例?

我发现一个线程谈到尝试使用Tomcat,但最终放弃它并使用内置的Winstone.我需要使用容器而不是内置的Winstone,因为默认的Winstone似乎以32位进程运行,而我正在使用的构建调用SharePoint PowerShell cmdlet,这些cmdlet只能在64位进程中使用.

64-bit tomcat multiple-instances jenkins

7
推荐指数
0
解决办法
3607
查看次数

如何模拟autofac的自动生成的委托工厂?

我正努力为我的一个课程进行单元测试.我想注入我的工厂,而不是autofac解决的自动生成的工厂.如何将自己的函数注册为代理来替换自动生成的委托工厂?

我的代码看起来像这是大纲形式:

interface IEntryImporter { ... }

class EntryImporter : IEntryImporter {
    public EntryImporter(ISeries series, IMatch match, Entry.Factory entryFactory) {
        :
    }
    :
}

interface IEntry : { ... }
class Entry : IEntry {
    public delegate IEntry Factory();
    public Entry() { ... }
}

interface IMatch : { ... }
class Match : IMatch { ... }

interface ISeries : { ... }
class Series : ISeries { ... }

void IEntry MyEntryFactory() {
    var entry = new Mock<IEntry>(); …
Run Code Online (Sandbox Code Playgroud)

unit-testing moq autofac

6
推荐指数
1
解决办法
2311
查看次数

2-3-5-7 轮分解似乎跳过了素数 331

当按照维基百科上的轮分解过程进行操作时,我似乎无意中遇到了一个问题:如果我尝试构建 2-3-5-7 轮,则素数 331 被视为合数。

采用2-3-5-7轮,2*3*5*7=210。因此,我设置了一个包含 210 个槽位的圆圈,并顺利完成步骤 1-7。然后我进入第8步,划掉所有素数倍数的辐条,最终划掉以121为根的辐条,121是11的倍数,11是素数。对于以 121 为根的辐条,121 + 210 = 331。不幸的是,331 是一个质数。

维基百科上的程序不正确吗?

或者我是否误解了该过程,应该只删除 2、3、5 和 7 的倍数的辐条,而不删除任何小于 210 的其他素数?

primes sieve factorization wheel-factorization

6
推荐指数
1
解决办法
3253
查看次数

如何使用Autofac 2.4.5处理循环引用?

关于循环引用的autofac wiki页面说使用:

cb.Register<DependsByProp>().OnActivated(ActivatedHandler.InjectUnsetProperties);
Run Code Online (Sandbox Code Playgroud)

但看起来ActivatedHandler在2.4.5中不再存在了.在源代码中挖掘,我找到了该类的实现,因此我在OnActivated中添加了方法实现.不幸的是,它仍然无效.

我在这里整理了一个最小的repro,看起来就像Wiki页面上的内容.

class M
{
    public VM VM { get; set; }

    public M()
    {
    }
}

class VM
{
    public VM(M m)
    {
    }
}

[Fact]
void CanResolveCircular()
{
    ContainerBuilder builder = new ContainerBuilder();

    builder.RegisterType<VM>();
    builder.RegisterType<M>().OnActivated(e => e.Context.InjectUnsetProperties(e.Instance));

    using (var container = builder.Build())
    {
        var m = container.Resolve<M>();
        Assert.NotNull(m);
    }
}
Run Code Online (Sandbox Code Playgroud)

当尝试Resolve时,此代码仍会引发堆栈溢出异常.我错过了什么?让Autofac处理循环依赖的正确方法是什么?

dependency-injection circular-dependency autofac property-injection

5
推荐指数
2
解决办法
5162
查看次数

使用共享程序集时如何配置 log4net?

使用共享程序集时如何配置 log4net?

我有多个依赖于公共组件的组件。每个组件都位于其自己的组件中。所有组件都使用 log4net 进行日志记录。所有组件都加载到单个进程空间中,但组件的使用顺序各不相同。所有外向组件在首次使用时加载各自的 log4net 配置,以尝试将日志数据发送到它们。通用组件不加载任何配置。此外,还有一个不使用公共组件的遗留组件。它还在首次使用时暴露并加载其配置。我无法直接接触这个遗留组件的代码或配置。

我面临的问题是,由于组件在第一次使用时加载其配置,最后一个加载配置的人获胜。这会导致发生日志记录,但所有日志输出最终都会进入加载的最后一个配置。显然,查看日志文件并将其他组件的日志条目写入其中是很丑陋的。

我通过使用 RepositoryAttribute 和 AliasRepositoryAttribute 找到了部分解决方案。这让外部组件将它们的配置加载到它们的“记录器存储库”中,并有效地将它们彼此隔离。遗留组件现在可以愉快地写入自己的日志,而我的组件没有噪音,我的组件也可以愉快地写入自己的日志,而不会在其他日志中产生噪音。

我说部分解决方案是因为仍然存在公共组件的日志记录情况。使用 AliasRepositoryAttribute 时,加载并为公共组件设置别名的第一个组件会获取所有日志输出,即使它是另一个正在调用公共组件的组件。这很糟糕,因为我会在后面的组件中丢失重要的日志信息,而且我会在第一个日志中包含不相关的日志信息。

下面的代码演示了这个问题:

通用:(代表通用组件)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using log4net.Config;
[assembly: Repository("CommonLib")]

namespace CommonLib
{
    public class CommonClass
    {
        static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public void DoCommon(string from)
        {
            Log.Debug("DoCommon:" + from);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

库 A:(代表其中一个外向组件)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using CommonLib;
using log4net;
using log4net.Config;
[assembly: Repository("ALib")]
[assembly: AliasRepository("CommonLib")]

namespace ALib …
Run Code Online (Sandbox Code Playgroud)

log4net log4net-configuration

5
推荐指数
0
解决办法
1251
查看次数