`std :: vector` throws a" bad selection "exception when resizing

I have the following code in a C ++ dll that I call through JNI:

std::vector<double> myVector;
myVector.resize(10000000, 0);

I get a "poor selection" exception, although the maximum size for a vector is supposedly over 10,000,000.

Which tool should I use to track memory allocation to find memory leaks?

If there are really no memory leaks, how can I reduce the traces of the vector to provide enough space?

+4
source share
1 answer

I know that this is probably the worst solution to find out the size of your distribution. So here it is:

main.cpp:

#include "jni.h"
#include <vector>
#include <iostream>

#if (_MSC_VER == 1800) || (__cplusplus >= 201103L)
    #include <thread>
    #include <chrono>
#elif _MSC_VER
    #include <windows.h>
#else
    #include <unistd.h>
#endif


extern "C" JNIEXPORT void Java_test_Test_Alloc(JNIEnv* env, jobject obj, jint max_size, jint increment_size)
{
    std::vector<double> vec;
    size_t isize = max_size / 4;
    size_t oldsize = isize;

    while(isize <= max_size)
    {
        try
        {
            vec.resize(isize, 0);
            oldsize = isize;
            isize += increment_size;
            std::cout<<"Allocated: "<<vec.size() * sizeof(double)<<" bytes.\n";
        }
        catch (std::bad_alloc &e)
        {
            std::cout<<"Failed to allocate: "<<isize * sizeof(double)<<" bytes.\n";
            std::cout<<"Approx. max size: "<<oldsize * sizeof(double)<<" bytes.\n";
            std::cout<<"Exception: "<<e.what()<< "\n";
            std::cout<<"Vector.Max_Size(): "<<vec.max_size()<< "\n";
            break;
        }

        #if (_MSC_VER == 1800) || (__cplusplus >= 201103L)
            std::this_thread::sleep_for(std::chrono::seconds(1));
        #elif _MSC_VER
            Sleep(1);
        #else
            sleep(1);
        #endif
    }
}

#if defined _WIN32 || defined _WIN64
#include <windows.h>

extern "C" __declspec(dllexport) bool __stdcall DllMain(HINSTANCE hinstDLL, unsigned fdwReason, void* lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            break;

        case DLL_PROCESS_DETACH:
            break;
    }
    return true;
}
#endif

And on the Java side (Test.java):

package test;

public class Test {

    static {
        System.loadLibrary("JNITest");
    }

    public static native void Alloc(int max_size, int increment_size);

    public static void main(String[] args) {
        Alloc(100000000, 50000);
    }

}

:

Allocated: 200000000 bytes.
Allocated: 200400000 bytes.
Allocated: 200800000 bytes.
.
.
.
Allocated: 399600000 bytes.
Allocated: 400000000 bytes.
Failed to allocate: 400400000 bytes.
Approx. max size: 400000000 bytes.
Exception: std::bad_alloc
Vector.Max_Size(): 536870911

.. "" , , , , , ..

+1

Source: https://habr.com/ru/post/1527739/


All Articles