小编Ale*_*hov的帖子

为什么内存分配2 ^ 80字节不会失败?

以下代码不会抛出异常并打印"成功".为什么?

#include <iostream>

int main() 
{
    size_t size = size_t(1024)*1024*1024*1024*1024*1024*1024*1024;
    char* data = new char[size];

    if (data == NULL)
        std::cout << "fail" << std::endl;
    else
        std::cout << "success" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 编译器:g ++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3
  • 操作系统:Ubuntu 12.04
  • RAM:8 GB

如果这是它的工作方式,我如何检查我有足够的内存?

[ 编辑:让我的愚蠢代码更正确,现在如果我删除两个,它至少会在x64上失败*1024]

c++ memory-management

16
推荐指数
3
解决办法
1017
查看次数

strcmp行为

当我运行以下代码时:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    p = strcmp(NULL,"foo");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到分段错误.回声$?139.但是当我跑的时候

#include <stdio.h>

int main(int argc, char *argv[])
{
    int p = 0;

    strcmp(NULL,"foo"); // Note removed assignment

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有任何分段错误.有人可以请一些光吗?

这是我的gcc信息:

> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
Run Code Online (Sandbox Code Playgroud)

c string strcmp

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

编译时"strlen()"有效吗?

有时需要将字符串的长度与常量进行比较.
例如:

if ( line.length() > 2 )
{
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

但我试图避免在代码中使用"魔术"常量.
通常我使用这样的代码:

if ( line.length() > strlen("[]") )
{
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

由于函数调用,它更具可读性,但效率更高.
我写了模板函数如下:

template<size_t N>
size_t _lenof(const char (&)[N])
{
    return N - 1;
}

template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
    return N - 1;
}

// Using:
if ( line.length() > _lenof("[]") )
{
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

在发布版本(VisualStudio 2008)中,它生成了非常好的代码:

cmp    dword ptr [esp+27Ch],2 
jbe    011D7FA5 
Run Code Online (Sandbox Code Playgroud)

好的是编译器在二进制输出中不包含"[]"字符串.

它是特定于编译器的优化还是常见行为?

c++ string performance templates

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

有没有办法在约束违规时提供用户友好的错误消息

说我有列Gender和约束CHECK( Gender IN ('F', 'M', 'OTHER')).
如果我不小心忘记在客户端处理这个问题,用户会看到smth
ORA-02290: check constraint (SYS_C099871244) violated
对于用户来说也不是很有帮助,对于维护或调试的开发人员也是如此

有没有办法提供开发人员定义的消息,如(伪)Java
assert Gender IN (0,1):'Gender must be F or M'

我能想到的唯一方法是将约束移动到BEFORE UPDATE或INSERT触发器以及失败时Raise_Application_Error( code, my_message ).但我不喜欢它

编辑 具体原因的列表,如评论中所述
1.我真的希望保持逻辑尽可能接近数据
2.对于最终用户,Raise_Application_Error消息与应用程序消息
3 无法区分.即使访问数据绕过,开发人员也会看到好消息应用程序
4.将约束移动到触发器是丑陋的(是吗?),所以我必须找到与Raise_Application_Error不同的smth

EDITA2 1.5 年后,在我离开与db相关的工作之后,它终于发生在我身上,我真的不喜欢这个 - 代码重复.我必须在服务器和客户端重复完全相同的逻辑.最有可能的是,有两种不同的语言.并保持同步.这只是丑陋的.

虽然答案清楚地表明,但我无能为力.所以现在是我成为好公民并最终接受答案的时候了(对不起,只是忘记了这一点).

oracle user-friendly

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

我应该在固定类型大小的langs中使用'long'代替'int'而不是'int'(如Java,C#)

在10年甚至5年内,将没有[ Edit2:服务器或桌面] 32位CPU.

那么,使用int(32位)long(64位)有什么优势吗?
使用中有什么缺点int吗?


编辑:

  1. 通过10 or 5 years我的意思是在绝大多数地方,这些LANGS使用

  2. 我的意思是默认使用哪种类型.这一天,我甚至都不愿意考虑是否应该使用short循环计数器for(int i....long计数器已经赢了同样的方式

  3. 寄存器已经是64位,32位类型已经没有增益.我认为8位类型有一些损失(你必须使用更多位然后你正在使用)

c# java d 32bit-64bit

11
推荐指数
2
解决办法
7358
查看次数

如何获取DBGrid单元格的屏幕坐标

我想在当前行的特定单元格的右下角显示弹出按钮或花哨的消息(带有彩色背景等).

现在我只想知道如何获取网格坐标:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]

还有TCustomGrid.CellRect,它会做我想要的,但它受到保护,我不想继承和创建另一个组件类.

我能想到的一个疯狂的解决方法是将onDrawColumnCell事件中的TRect-s保存到某个数组中.

所以你怎么看 ?

编辑
如何获取当前行中第二个单元格的屏幕坐标?

delphi tdbgrid delphi-6

5
推荐指数
1
解决办法
7222
查看次数

为什么我不能在Service的构造函数中使用Context.getPackageManager

如果我尝试使用它,我会NullPointerException.如果移出构造函数,它可以正常工作.所以,我很好奇发生了什么.

这是代码:

package com.example.nullptrservice;

import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() {
        super();
        PackageManager pm = this.getPackageManager();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        Log.i("MyService", "---------- started --------");
        return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) { return null; }
}
Run Code Online (Sandbox Code Playgroud)

当我手动运行服务时,这是logcat输出:

D/AndroidRuntime( 4174): 
D/AndroidRuntime( 4174):  AndroidRuntime START com.android.internal.os.RuntimeInit 
D/AndroidRuntime( 4174): CheckJNI is OFF
D/AndroidRuntime( 4174): Calling main entry com.android.commands.am.Am
D/dalvikvm( 4184): Late-enabling CheckJNI …

android

5
推荐指数
1
解决办法
8011
查看次数

如何使用 chrono 获取 UTC 格式的系统时间

我正在尝试使用 chrono.txt 查找 UTC 格式的系统时间。我认为下面的程序只给我当地时间,请有人帮帮我吗?

#include <iostream>
#include <chrono>
#include <ctime>  

auto GetSystemTime() -> uint8_t * {
    auto now = std::chrono::system_clock::now();
    std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
    return reinterpret_cast<uint8_t *>(std::ctime(&currentTime));
}

int main()
{

   std::cout << GetSystemTime();
    
}
Run Code Online (Sandbox Code Playgroud)

c++ c++14 c++17

3
推荐指数
1
解决办法
2601
查看次数

用Java打印数组

这次我想从头到尾打印一个数组.

这就是我写的:

public class Arrays {
public static void main (String[] args){
    for (int i = args.length; i >=0; i--){
        System.out.print(args[i]+" ");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误消息:线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:4在Assignment02Q04.main(Assignment02Q04.java:5).

仍然很难实现Eclipse错误通知.我很乐意提供帮助.

java arrays

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

使用Java 8 Streams将地图映射转换为列表

我有一张地图:

Map<String, Map<Integer, List<Integer>>>
e.g. Map<Name, Map<Id, List<ReferenceId>>>

Outcome:
List<Id>
List<ReferenceId>
Run Code Online (Sandbox Code Playgroud)

我想将这个地图转换成两个整数列表.一个列表包含内部映射键,另一个列表包含内部映射值(即List<Integer>)

任何人都可以告诉我如何使用流在Java 8中执行此操作?

我试过这种方式但得到了Cast Exception,无法将String转换为Integer.

map.values().stream()
    .map(m -> m.entrySet()
    .stream()
    .map(e -> e.getKey())
    .collect(Collectors.toList()))
    .flatMap(l -> l.stream())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

std::atomic&lt;std::string&gt;:在 Visual Studio 2013 (VC12) 中写入位置 0xFEEEEFEEE 时出现访问冲突 - 使用 std::atomic&lt;int&gt; 时不会发生

以下最小代码示例在 x64 调试模式下编译并在 Visual Studio 2013 调试器中运行,生成

未处理的异常位于...:访问冲突写入位置 0xFEEEFEEE。

调试时,我发现访问冲突发生在“return 0;”处 陈述。

(当在没有调试器的情况下从控制台运行时,错误显示“0x 处的指令...引用了 0xddddddd 处的内存...无法写入内存。”)。

#include <atomic>
#include <string>

int main()
{
  std::atomic<std::string> a1("127.0.0.1:41001");
  std::string ep1_1 = a1.load();
  std::string ep1_2 = a1.load();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

multithreading c++11 stdatomic

0
推荐指数
1
解决办法
1129
查看次数